ZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4NzgxMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2ExNTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPk15RmFjZXMgRmFjZWxldHMgQXJjaGV0eXBlPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyB3ZWJhcHAgYmFzZWQgb24gTXlGYWNlcyBhbmQgRmFjZWxldHM8L2Rlc2NyaXB0aW9uPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5MWY4MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPGFyY2hldHlwZT4KLSAgPGlkPm1hdmVuLWFyY2hldHlwZS1teWZhY2VzLWZhY2VsZXRzPC9pZD4KLSAgPHNvdXJjZXM+Ci0gICAgPHNvdXJjZT5zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmE8L3NvdXJjZT4KLSAgPC9zb3VyY2VzPgotICA8dGVzdFNvdXJjZXM+DQotICA8IS0tIAotICAgIDxzb3VyY2U+c3JjL3Rlc3QvamF2YS9BcHBUZXN0LmphdmE8L3NvdXJjZT4NCi0gICAgIC0tPgotICA8L3Rlc3RTb3VyY2VzPg0KLSAgPHJlc291cmNlcz4NCi0gICAgPHJlc291cmNlPnBvbS54bWw8L3Jlc291cmNlPg0KLSAgCTxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9yZXNvdXJjZT4NCi0gIAk8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvdG9tYWhhd2sudGFnbGliLnhtbDwvcmVzb3VyY2U+DQotICAJPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWw8L3Jlc291cmNlPg0KLSAgCTxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC54aHRtbDwvcmVzb3VyY2U+DQotICAJPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9pbmRleC5qc3A8L3Jlc291cmNlPg0KLSAgCTxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvcGFnZTIueGh0bWw8L3Jlc291cmNlPg0KLSAgCTxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvdGVtcGxhdGUueGh0bWw8L3Jlc291cmNlPg0KLSAgPC9yZXNvdXJjZXM+Ci08L2FyY2hldHlwZT4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2YjM2YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxuYW1lPkEgY3VzdG9tIHByb2plY3QgdXNpbmcgbXlmYWNlczwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly93d3cubXlvcmdhbml6YXRpb24ub3JnPC91cmw+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxmaW5hbE5hbWU+JHthcnRpZmFjdElkfTwvZmluYWxOYW1lPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1tYXZlbi1zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMTwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PiAgICAgICAgCi0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8IS0tIFByb2plY3QgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b21haGF3azwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjY8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+ICAgIAotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4gICAgCi0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+ICAgCi0gICAgCi0gICAgIAk8ZGVwZW5kZW5jeT4KLQkJICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+Ci0JCSAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+Ci0JCSAgICA8dmVyc2lvbj4xLjEuMTE8L3ZlcnNpb24+Ci0JICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj40LjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQmFja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzk5ODlhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgJHBhY2thZ2U7Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptYXR6ZXdAYXBhY2hlLm9yZyI+TWF0dGhpYXMgV2XfZW5kb3JmPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRCYWNraW5nCi17Ci0KLSAgICAvL3Byb3BlcnRpZXMKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQmFja2luZygpCi0gICAgewotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljCi0gICAgICAgIHJldHVybiAoInN1Y2Nlc3MiKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZhYjUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08ZmFjZXMtY29uZmlnPgotCi0JPGFwcGxpY2F0aW9uPgotCQk8dmlldy1oYW5kbGVyPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC92aWV3LWhhbmRsZXI+Ci0JPC9hcHBsaWNhdGlvbj4KLQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZEJhY2tpbmc8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPgotCQkJJHtwYWNrYWdlfS5IZWxsb1dvcmxkQmFja2luZwotCQk8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQueGh0bWw8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLnhodG1sPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLnhodG1sPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvdG9tYWhhd2sudGFnbGliLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvdG9tYWhhd2sudGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmYzE0MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3RvbWFoYXdrLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIgImZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotPGZhY2VsZXQtdGFnbGliPgotICAgIDwhLS0gYXV0aG9yOiB0aG9tYXMuamFjaG1hbm5AbWluZG1hdHRlcnMuZGUgLS0+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RvbWFoYXdrPC9uYW1lc3BhY2U+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmNvbW1hbmRCdXR0b248L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sQ29tbWFuZEJ1dHRvbjwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuQnV0dG9uPC9yZW5kZXJlci10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+Y29tbWFuZExpbms8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sQ29tbWFuZExpbms8L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkxpbms8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5kYXRhVGFibGU8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sRGF0YVRhYmxlPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5UYWJsZTwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmlucHV0SGlkZGVuPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbElucHV0SGlkZGVuPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmlucHV0U2VjcmV0PC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbElucHV0U2VjcmV0PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5TZWNyZXQ8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5pbnB1dFRleHQ8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sSW5wdXRUZXh0PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5UZXh0PC9yZW5kZXJlci10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+aW5wdXRUZXh0SGVscDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxJbnB1dFRleHRIZWxwPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5UZXh0SGVscDwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmlucHV0VGV4dGFyZWE8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sSW5wdXRUZXh0YXJlYTwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuVGV4dGFyZWE8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5ncmFwaGljSW1hZ2U8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sR3JhcGhpY0ltYWdlPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5JbWFnZTwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPm1lc3NhZ2U8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sTWVzc2FnZTwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuTWVzc2FnZTwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPm1lc3NhZ2VzPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbE1lc3NhZ2VzPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5NZXNzYWdlczwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPm91dHB1dExhYmVsPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbE91dHB1dExhYmVsPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPm91dHB1dFRleHQ8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sT3V0cHV0VGV4dDwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuVGV4dDwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnBhbmVsR3JpZDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxQYW5lbEdyaWQ8L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkdyaWQ8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5wYW5lbEdyb3VwPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbFBhbmVsR3JvdXA8L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkdyb3VwPC9yZW5kZXJlci10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+c2VsZWN0T25lTWVudTwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxTZWxlY3RPbmVNZW51PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5NZW51PC9yZW5kZXJlci10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+c2VsZWN0TWFueU1lbnU8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sU2VsZWN0TWFueU1lbnU8L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLk1lbnU8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5zZWxlY3RPbmVSYWRpbzwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxTZWxlY3RPbmVSYWRpbzwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuUmFkaW88L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5zZWxlY3RCb29sZWFuQ2hlY2tib3g8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5DaGVja2JveDwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnNlbGVjdE1hbnlDaGVja2JveDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g8L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkNoZWNrYm94PC9yZW5kZXJlci10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+c2VsZWN0T25lTGlzdGJveDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxTZWxlY3RPbmVMaXN0Ym94PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5MaXN0Ym94PC9yZW5kZXJlci10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+c2VsZWN0TWFueUxpc3Rib3g8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sU2VsZWN0TWFueUxpc3Rib3g8L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkxpc3Rib3g8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5pbnB1dENhbGVuZGFyPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbElucHV0Q2FsZW5kYXI8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+anNWYWx1ZUNoYW5nZUxpc3RlbmVyPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSnNWYWx1ZUNoYW5nZUxpc3RlbmVyPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmpzVmFsdWVTZXQ8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sSnNWYWx1ZVNldDwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5jaGVja2JveDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxDaGVja2JveDwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5jb21tYW5kTmF2aWdhdGlvbjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxDb21tYW5kTmF2aWdhdGlvbjwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuTmF2aWdhdGlvbjwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmNvbW1hbmROYXZpZ2F0aW9uMjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxDb21tYW5kTmF2aWdhdGlvbkl0ZW08L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLk5hdmlnYXRpb25NZW51PC9yZW5kZXJlci10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+Y29tbWFuZFNvcnRIZWFkZXI8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sQ29tbWFuZFNvcnRIZWFkZXI8L2NvbXBvbmVudC10eXBlPgotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLlNvcnRIZWFkZXI8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5kYXRhTGlzdDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxEYXRhTGlzdDwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5kYXRhU2Nyb2xsZXI8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sRGF0YVNjcm9sbGVyPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmlucHV0RGF0ZTwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxJbnB1dERhdGU8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+aW5wdXRGaWxlVXBsb2FkPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbElucHV0RmlsZVVwbG9hZDwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5pbnB1dEh0bWw8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5JbnB1dEh0bWw8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+bmF2aWdhdGlvbk1lbnVJdGVtPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuTmF2aWdhdGlvbk1lbnVJdGVtPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPm5hdmlnYXRpb25NZW51SXRlbXM8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPmphdmF4LmZhY2VzLlNlbGVjdEl0ZW1zPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmpzY29va01lbnU8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5KU0Nvb2tNZW51PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnBhbmVsTGF5b3V0PC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbFBhbmVsTGF5b3V0PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnBhbmVsTmF2aWdhdGlvbjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxQYW5lbE5hdmlnYXRpb248L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+cGFuZWxOYXZpZ2F0aW9uMjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxQYW5lbE5hdmlnYXRpb25NZW51PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5OYXZpZ2F0aW9uTWVudTwvcmVuZGVyZXItdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnBhbmVsVGFiPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbFBhbmVsVGFiPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnBhbmVsVGFiYmVkUGFuZTwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxQYW5lbFRhYmJlZFBhbmU8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8IS0tIGRlYWN0aXZhdGVkIHNpbmNlIHRoZXJlJ3Mgbm8gY29tcG9uZW50ISB0YWc+Ci0gICAgICAgIDx0YWctbmFtZT50YWJDaGFuZ2VMaXN0ZW5lcjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgIDxjb21wb25lbnQtdHlwZT48L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICAgICAgPC90YWctLT4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+Y29sbGFwc2libGVQYW5lbDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxDb2xsYXBzaWJsZVBhbmVsPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnNlbGVjdE9uZUNvdW50cnk8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5TZWxlY3RPbmVDb3VudHJ5PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnNlbGVjdE9uZUxhbmd1YWdlPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuU2VsZWN0T25lTGFuZ3VhZ2U8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+c3R5bGVzaGVldDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLlN0eWxlc2hlZXQ8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+ZGl2PC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuRGl2PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmh0bWxUYWc8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sVGFnPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnJhZGlvPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbFJhZGlvPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnRyZWU8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sVHJlZTwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbFRyZWU8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDwhLS0gZGVhY3RpdmF0ZWQgc2luY2UgdGhlcmUncyBubyBjb21wb25lbnQhIHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnRyZWVTZWxlY3Rpb25MaXN0ZW5lcjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgIDxjb21wb25lbnQtdHlwZT48L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICAgICAgPC90YWctLT4KLSAgICA8IS0tIGRlYWN0aXZhdGVkIHNpbmNlIHRoZXJlJ3Mgbm8gY29tcG9uZW50ISB0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5pY29uUHJvdmlkZXI8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICA8Y29tcG9uZW50LXR5cGU+PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgICAgIDwvdGFnLS0+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnRyZWVDb2x1bW48L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sVHJlZUNvbHVtbjwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT50cmVlQ2hlY2tib3g8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sVHJlZUNoZWNrYm94PC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnRyZWUyPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuSHRtbFRyZWUyPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnBhbmVsU3RhY2s8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5IdG1sUGFuZWxTdGFjazwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5wb3B1cDwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxQb3B1cDwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5uZXdzcGFwZXJUYWJsZTwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxOZXdzcGFwZXJUYWJsZTwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5hbGlhc0JlYW48L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5BbGlhc0JlYW48L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+YWxpYXNCZWFuc1Njb3BlPC90YWctbmFtZT4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMuQWxpYXNCZWFuc1Njb3BlPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmJ1ZmZlcjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkJ1ZmZlcjwvY29tcG9uZW50LXR5cGU+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT5zYXZlU3RhdGU8L3RhZy1uYW1lPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy5TYXZlU3RhdGU8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8IS0tIGRlYWN0aXZhdGVkIHNpbmNlIHRoZXJlJ3Mgbm8gY29tcG9uZW50ISB0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51cGRhdGVBY3Rpb25MaXN0ZW5lcjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgIDxjb21wb25lbnQtdHlwZT48L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICAgICAgPC90YWctLT4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dmFsaWRhdGVDcmVkaXRDYXJkPC90YWctbmFtZT4KLSAgICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgICAgIDx2YWxpZGF0b3ItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnZhbGlkYXRvci5DcmVkaXRDYXJkPC92YWxpZGF0b3ItaWQ+Ci0gICAgICAgIDwvdmFsaWRhdG9yPgotICAgIDwvdGFnPgotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT52YWxpZGF0ZUVtYWlsPC90YWctbmFtZT4KLSAgICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgICAgIDx2YWxpZGF0b3ItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnZhbGlkYXRvci5FbWFpbDwvdmFsaWRhdG9yLWlkPgotICAgICAgICA8L3ZhbGlkYXRvcj4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dmFsaWRhdGVFcXVhbDwvdGFnLW5hbWU+Ci0gICAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICAgICA8dmFsaWRhdG9yLWlkPm9yZy5hcGFjaGUubXlmYWNlcy52YWxpZGF0b3IuRXF1YWw8L3ZhbGlkYXRvci1pZD4KLSAgICAgICAgPC92YWxpZGF0b3I+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnN3YXBJbWFnZTwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxTd2FwSW1hZ2U8L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+Y29sdW1uczwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxDb2x1bW5zPC9jb21wb25lbnQtdHlwZT4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPmNvbHVtbjwvdGFnLW5hbWU+Ci0gICAgICAgIDxjb21wb25lbnQ+Ci0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLkh0bWxDb2x1bW48L2NvbXBvbmVudC10eXBlPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L3RhZz4KLSAgICA8IS0tIGFkZGl0aW9uYWwgdmFsaWRhdG9ycyAobm90ZTogbm90IGluIHRsZCwgc28gbm8gY29kZSBjb21wbGV0aW9uKSAtLT4KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dmFsaWRhdGVSZWdFeHByPC90YWctbmFtZT4KLSAgICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgICAgIDx2YWxpZGF0b3ItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnZhbGlkYXRvci5SZWdFeHByPC92YWxpZGF0b3ItaWQ+Ci0gICAgICAgIDwvdmFsaWRhdG9yPgotICAgIDwvdGFnPgotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTZiNTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0JKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0JKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLQkqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0JKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0JKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0JKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0JKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0JKgotCSogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQkqCi0JKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0JKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotCSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0JKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLQkqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLQkqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLQl2ZXJzaW9uPSIyLjQiPgotCi0JPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5qYm9zcy5qYm9zc2ZhY2VzLldBUl9CVU5ETEVTX0pTRl9JTVBMCi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTwhLS0gQ29uZmlndXJlIHRvbWFoYXdrIHRhZ2xpYiAtLT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+L1dFQi1JTkYvdG9tYWhhd2sudGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPCEtLSBVc2UgRG9jdW1lbnRzIFNhdmVkIGFzICoueGh0bWwgLS0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8IS0tIFNwZWNpYWwgRGVidWcgT3V0cHV0IGZvciBEZXZlbG9wbWVudCAtLT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPHBhcmFtLW5hbWU+ZmFjZWxldHMuREVWRUxPUE1FTlQ8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnCi0JCQlmaWxlcy4gKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkgU2VlIEpTRiAxLjAgUFJEMiwKLQkJCTEwLjMuMiBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQKLQkJCS9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KSBTZWUKLQkJCUpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJT25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0KLQkJCWRlZmF1bHQpLiBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdAotCQkJdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTgotCQk8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlPbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPQotCQkJZGVmYXVsdCkuIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8KLQkJCWEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlCi0JCQl0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTgotCQk8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCU9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9Ci0JCQlkZWZhdWx0KSBhbmQgaWYKLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9Ci0JCQlkZWZhdWx0KSBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlCi0JCQljb21wcmVzc2VkIGJlZm9yZSBpdCBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUKLQkJCXN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT04KLQkJPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUKLQkJCWFsbG93ZWQgaW4gdGhlIHJlbmRlcmVkIEhUTUwgb3V0cHV0LiBJZiBqYXZhc2NyaXB0IGlzCi0JCQlhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlIHRoYXQKLQkJCXN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4gSWYgamF2YXNjcmlwdCBpcyBub3QKLQkJCWFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMgd2lsbCBiZQotCQkJYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuIERlZmF1bHQ6ICJ0cnVlIgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzCi0JCQkiaHVtYW4gcmVhZGFibGUiLiBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZAotCQkJd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90IGluZmx1ZW5jZSB0aGUgSFRNTAotCQkJY29kZS4gRGVmYXVsdDogInRydWUiCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlCi0JCQl0byByZXN0b3JlIHRoZSBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuCi0JCQlDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UKLQkJCWRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcCBpZgotCQkJeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZQotCQkJcGFnZS4gRGVmYXVsdDogImZhbHNlIgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQKLQkJCXNpZGUgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24KLQkJCWZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IKLQkJCWRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0Ci0JCQlmb3JtcyBhcmUgbm90IG5lc3RlZC4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yCi0JCQlzZWxlY3QgZWxlbWVudHMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTCi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4KLQkJCWEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcKLQkJCVN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91Ci0JCQl3YW50IHRvIGFkZCBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlCi0JCQlFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20KLQkJCWltcGxlbWVudGF0aW9uIGhlcmUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZQotCQk8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcwotCQkJZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRICi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVIKLQkJPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCURlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPCEtLSBFeHRlbnNpb25zIEZpbHRlciAtLT4KLQk8ZmlsdGVyPgotCQk8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0JCTxmaWx0ZXItY2xhc3M+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLmZpbHRlci5FeHRlbnNpb25zRmlsdGVyCi0JCTwvZmlsdGVyLWNsYXNzPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQlTZXQgdGhlIHNpemUgbGltaXQgZm9yIHVwbG9hZGVkIGZpbGVzLiBGb3JtYXQ6IDEwIC0gMTAKLQkJCQlieXRlcyAxMGsgLSAxMCBLQiAxMG0gLSAxMCBNQiAxZyAtIDEgR0IKLQkJCTwvZGVzY3JpcHRpb24+Ci0JCQk8cGFyYW0tbmFtZT51cGxvYWRNYXhGaWxlU2l6ZTwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT4xMDBtPC9wYXJhbS12YWx1ZT4KLQkJPC9pbml0LXBhcmFtPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQlTZXQgdGhlIHRocmVzaG9sZCBzaXplIC0gZmlsZXMgYmVsb3cgdGhpcyBsaW1pdCBhcmUKLQkJCQlzdG9yZWQgaW4gbWVtb3J5LCBmaWxlcyBhYm92ZSB0aGlzIGxpbWl0IGFyZSBzdG9yZWQgb24KLQkJCQlkaXNrLgotCi0JCQkJRm9ybWF0OiAxMCAtIDEwIGJ5dGVzIDEwayAtIDEwIEtCIDEwbSAtIDEwIE1CIDFnIC0gMSBHQgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJCTxwYXJhbS1uYW1lPnVwbG9hZFRocmVzaG9sZFNpemU8L3BhcmFtLW5hbWU+Ci0JCQk8cGFyYW0tdmFsdWU+MTAwazwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQk8L2ZpbHRlcj4KLQotCTxmaWx0ZXItbWFwcGluZz4KLQkJPGZpbHRlci1uYW1lPmV4dGVuc2lvbnNGaWx0ZXI8L2ZpbHRlci1uYW1lPgotCQk8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotCTwvZmlsdGVyLW1hcHBpbmc+Ci0JPGZpbHRlci1tYXBwaW5nPgotCQk8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0JCTx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0JPC9maWx0ZXItbWFwcGluZz4KLQotCTwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotCTxsaXN0ZW5lcj4KLQkJPGxpc3RlbmVyLWNsYXNzPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcgotCQk8L2xpc3RlbmVyLWNsYXNzPgotCTwvbGlzdGVuZXI+Ci0KLQk8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0JPHNlcnZsZXQ+Ci0JCTxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotCQk8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotCQk8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLQk8L3NlcnZsZXQ+Ci0KLQk8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLQk8c2VydmxldC1tYXBwaW5nPgotCQk8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLQkJPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLQk8L3NlcnZsZXQtbWFwcGluZz4KLQotCTwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLQk8d2VsY29tZS1maWxlLWxpc3Q+Ci0JCTx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0JCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotCTwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWZkMzk5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotCXhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0JeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0JeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCI+DQotPGhlYWQ+DQotPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIvdGVtcGxhdGUueGh0bWwiPg0KLQ0KLQk8dWk6ZGVmaW5lIG5hbWU9ImJvZHkiPg0KLQkJPGg6Zm9ybSBpZD0iZm9ybSI+DQotCQkJPGg6cGFuZWxHcmlkIGlkPSJncmlkIiBjb2x1bW5zPSIyIj4NCi0JCQkJPGg6b3V0cHV0VGV4dCBpZD0ib3V0cHV0MSIgdmFsdWU9IlBsZWFzZSBlbnRlciB5b3VyIG5hbWUiIC8+DQotCQkJCTxoOmlucHV0VGV4dCBpZD0iaW5wdXQxIiB2YWx1ZT0iI3toZWxsb1dvcmxkQmFja2luZy5uYW1lfSINCi0JCQkJCXJlcXVpcmVkPSJ0cnVlIiAvPg0KLQkJCQk8aDpjb21tYW5kQnV0dG9uIGlkPSJidXR0b24xIiB2YWx1ZT0icHJlc3MgbWUiDQotCQkJCQlhY3Rpb249IiN7aGVsbG9Xb3JsZEJhY2tpbmcuc2VuZH0iIC8+DQotCQkJCTxoOm1lc3NhZ2UgaWQ9Im1lc3NhZ2UxIiBmb3I9ImlucHV0MSIgLz4NCi0JCQk8L2g6cGFuZWxHcmlkPg0KLQkJPC9oOmZvcm0+DQotCTwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWMyMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MTNjNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0JeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLQl4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLQl4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIj4NCi08aGVhZD4NCi08dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi0NCi08Zjp2aWV3Pg0KLQk8aDpvdXRwdXRUZXh0DQotCQl2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkQmFja2luZy5uYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMiIC8+DQotCTxoOmZvcm0gaWQ9ImZvcm0yIj4NCi0JCTxoOmNvbW1hbmRMaW5rIGlkPSJsaW5rMSIgYWN0aW9uPSJiYWNrIj4NCi0JCQk8aDpvdXRwdXRUZXh0IGlkPSJsaW5rVGV4dCIgdmFsdWU9IkdPIEhPTUUiIC8+DQotCQk8L2g6Y29tbWFuZExpbms+DQotCTwvaDpmb3JtPg0KLTwvZjp2aWV3Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvdGVtcGxhdGUueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmODhiMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0JeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLQl4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLQl4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIj4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPg0KLTx0aXRsZT5NeWZhY2VzIEV4YW1wbGUgRmFjZWxldHM8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi08aDE+PHVpOmluc2VydCBuYW1lPSJ0aXRsZSI+TXlmYWNlcyBFeGFtcGxlIEZhY2VsZXRzPC91aTppbnNlcnQ+PC9oMT4NCi08cD48dWk6aW5zZXJ0IG5hbWU9ImJvZHkiPkhlbGxvIFdvcmxkIEV4YW1wbGUhPC91aTppbnNlcnQ+PC9wPg0KLTwvYm9keT4NCi0NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVhMDQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0czwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICAgIDxuYW1lPk15RmFjZXMgUG9ydGxldCBBcmNoZXR5cGU8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBuZXcgcG9ydGxldCB3ZWJhcHAgYmFzZWQgb24gbXlmYWNlczwvZGVzY3JpcHRpb24+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDllNzg5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotIAotIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAKLS0tPgotCi08YXJjaGV0eXBlPgotICA8aWQ+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0czwvaWQ+Ci0gIDxyZXNvdXJjZXM+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BvcnRsZXQvZmFjZXMvZGVtby9oZWxsb3dvcmxkL05hbWVCZWFuLmphdmE8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2VkaXQuanNwPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2hlbHAuanNwPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaGVsbG8uanNwPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaW5kZXguanNwPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL3BvcnRsZXQueG1sPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXBsdXRvLXdlYi1kZWZhdWx0LnhtbDwvcmVzb3VyY2U+Ci0gIDwvcmVzb3VyY2VzPgotPC9hcmNoZXR5cGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRjYzFjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxuYW1lPkEgY3VzdG9tIHByb2plY3QgdXNpbmcgbXlmYWNlczwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly93d3cubXlvcmdhbml6YXRpb24ub3JnPC91cmw+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPiAgICAKLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnBvcnRsZXQtYXBpPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cG9ydGxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMucG9ydGxldC1icmlkZ2U8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wb3J0bGV0LWJyaWRnZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMC1hbHBoYS0yPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnBvcnRsZXQtYnJpZGdlPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cG9ydGxldC1icmlkZ2UtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4wLWFscGhhLTI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamRldi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGJ1aWxkPC9ncm91cElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8bGlicmFyaWVzPgotICAgICAgICAgICAgPGxpYnJhcnk+SlNQIFJ1bnRpbWU8L2xpYnJhcnk+Ci0gICAgICAgICAgPC9saWJyYXJpZXM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLSAgCi0gIDxwcm9wZXJ0aWVzPgotICAgIDxqc2YudmVyc2lvbj4xLjJfMDM8L2pzZi52ZXJzaW9uPgotICA8L3Byb3BlcnRpZXM+Ci0gICAgCi0gIDxwcm9maWxlcz4KLSAgICA8IS0tIHNldHMgdXAgdGhlIHdlYmFwcCBmb3IgZGVwbG95bWVudCB0byBwbHV0byAgIm12biBjbGVhbiBpbnN0YWxsIC1QcGx1dG8iIC0tPiAgICAKLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD5wbHV0bzwvaWQ+Ci0gICAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgIDwhLS0gY29uZmlndXJlIG1hdmVuLXdhci1wbHVnaW4gdG8gdXNlIHVwZGF0ZWQgd2ViLnhtbCAtLT4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICA8d2ViWG1sPgotICAgICAgICAgICAgICAgICAgICAgICAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcGx1dG8tcmVzb3VyY2VzL3dlYi54bWwKLSAgICAgICAgICAgICAgICA8L3dlYlhtbD4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgCi0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUucGx1dG88L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHV0by1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPiAgCi0gICAgICAgICAgICAgIDxleGVjdXRpb24+ICAKLSAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4gIAotICAgICAgICAgICAgICAgIDxnb2Fscz4gIAotICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibGU8L2dvYWw+ICAKLSAgICAgICAgICAgICAgICA8L2dvYWxzPiAgCi0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgCi0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+ICAKLSAgICAgICAgICA8L3BsdWdpbj4gIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICA8L2J1aWxkPgotICAgIDwvcHJvZmlsZT4KLSAgICAKLSAgICA8IS0tIFRvIHJ1biBqZXR0eSwgaXNzdWUgIm12biBjbGVhbiAtUGpldHR5Q29uZmlnIGpldHR5OnJ1biIgLS0+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+amV0dHlDb25maWc8L2lkPgotICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD5jb20uYmVray5ib3NzPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdXRvLWVtYmVkZGVkPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPGJ1aWxkPiAgICAgIAotICAgICAgPHBsdWdpbnM+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPHdlYlhtbD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9wbHV0by1yZXNvdXJjZXMvd2ViLnhtbDwvd2ViWG1sPgotICAgICAgICAgICAgPHdlYkRlZmF1bHRYbWw+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktcGx1dG8td2ViLWRlZmF1bHQueG1sPC93ZWJEZWZhdWx0WG1sPgotICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLnBsdXRvLmVtYmVkZGVkLnBvcnRsZXRJZDwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+JHthcnRpZmFjdElkfTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnBsdXRvPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdXRvLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KLSAgICAgICAgICA8ZXhlY3V0aW9ucz4gIAotICAgICAgICAgICAgPGV4ZWN1dGlvbj4gIAotICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4gIAotICAgICAgICAgICAgICA8Z29hbHM+ICAKLSAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJsZTwvZ29hbD4gIAotICAgICAgICAgICAgICA8L2dvYWxzPiAgCi0gICAgICAgICAgICA8L2V4ZWN1dGlvbj4gIAotICAgICAgICAgIDwvZXhlY3V0aW9ucz4gIAotICAgICAgICA8L3BsdWdpbj4gIAotICAgICAgPC9wbHVnaW5zPgotICAgICAgPC9idWlsZD4gIAotICAgIDwvcHJvZmlsZT4gIAotICAKLSAgICA8IS0tIEJ5IGRlZmF1bHQgdGhlIHdhciBleGFtcGxlcyB1c2UgbXlmYWNlcyEgOikgLS0+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+bXlmYWNlczwvaWQ+Ci0gICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgIDxuYW1lPiFqc2Y8L25hbWU+Ci0gICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPC9wcm9maWxlPgotCi0gICAgPCEtLSBUbyB1c2UgdGhlIGV4YW1wbGVzIHVzaW5nIHRoZSBTdW4ncyBKU0YgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uOiBtdm4gY2xlYW4gaW5zdGFsbCAtRGpzZj1yaSAtLT4KLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD5qc2ZyaTwvaWQ+Ci0gICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgIDxuYW1lPmpzZjwvbmFtZT4KLSAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPgotICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgPGdyb3VwSWQ+amF2YXguZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZl9pbXBsZW1lbnRhdGlvbj5KU0YtUkk8L2pzZl9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L3Byb2ZpbGU+Ci0gICAgCi0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+anNmcmktcHJvdmlkZWQ8L2lkPgotICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICA8bmFtZT5qc2Y8L25hbWU+Ci0gICAgICAgICAgPHZhbHVlPnJpLXByb3ZpZGVkPC92YWx1ZT4KLSAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgIDwvYWN0aXZhdGlvbj4KLQotICAgICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICA8bmFtZT5qYXZhLm5ldCBNYXZlbiAxIFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgPHVybD5odHRwczovL21hdmVuLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0L25vbmF2L3JlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICA8L3JlcG9zaXRvcmllcz4KLSAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZl9pbXBsZW1lbnRhdGlvbj5KU0YtUkk8L2pzZl9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICA8L3Byb2ZpbGU+Ci0gIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BvcnRsZXQvZmFjZXMvZGVtby9oZWxsb3dvcmxkL05hbWVCZWFuLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BvcnRsZXQvZmFjZXMvZGVtby9oZWxsb3dvcmxkL05hbWVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTU4NDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wb3J0bGV0L2ZhY2VzL2RlbW8vaGVsbG93b3JsZC9OYW1lQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMucG9ydGxldC5mYWNlcy5kZW1vLmhlbGxvd29ybGQ7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lQmVhbgotewotICBwdWJsaWMgU3RyaW5nIF9uYW1lOwotICAKLSAgcHVibGljIE5hbWVCZWFuKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgX25hbWUpCi0gIHsKLSAgICB0aGlzLl9uYW1lID0gX25hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2ZGEwYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2ZvciBkZWJ1Z2dpbmcgbG9nNGogaXRzZWxmCi1sb2c0ai5kZWJ1Zz1mYWxzZQotCi0jTG9nZ2VyLVByaW9yaXRpZXM6Ci0jREVCVUcgbG93ZXN0LCBwcmludHMgYWxsIG1lc3NhZ2VzCi0jSU5GTyAgcHJpbnRzIGFsbCBtZXNzYWdlcyB3aXRoIEZBVEFMLCBFUlJPUiwgV0FSTiBvciBJTkZPIHByaW9yaXR5Ci0jV0FSTiAgcHJpbnRzIGFsbCBtZXNzYWdlcyB3aXRoIEZBVEFMLCBFUlJPUiBvciBXQVJOIHByaW9yaXR5Ci0jRVJST1IgcHJpbnRzIGFsbCBtZXNzYWdlcyB3aXRoIEZBVEFMIG9yIEVSUk9SIHByaW9yaXR5Ci0jRkFUQUwgaGlnaGVzdCwgcHJpbnRzIG9ubHkgRkFUQUwgbWVzc2FnZXMKLQotIyByb290IGxvZ2dlcgotbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBBMQotbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgLSAlbSVuCi0KLSMgbXlmYWNlcyBsb2dnZXIKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm15ZmFjZXM9SU5GTwpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODIxNjUzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8wLmR0ZCI+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvQ29uZmlndXJhdGlvbiI+DQotICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4NCi0gICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICA8ZnJvbS1vdXRjb21lPmhlbGxvV29ybGQ8L2Zyb20tb3V0Y29tZT4NCi0gICAgICA8dG8tdmlldy1pZD4vaGVsbG93b3JsZC9pbmRleC5qc3A8L3RvLXZpZXctaWQ+DQotICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgPC9uYXZpZ2F0aW9uLXJ1bGU+DQotICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICA8ZnJvbS12aWV3LWlkPi9oZWxsb3dvcmxkL2luZGV4LmpzcDwvZnJvbS12aWV3LWlkPg0KLSAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgIDxmcm9tLW91dGNvbWU+c2F5aGVsbG88L2Zyb20tb3V0Y29tZT4NCi0gICAgICA8dG8tdmlldy1pZD4vaGVsbG93b3JsZC9oZWxsby5qc3A8L3RvLXZpZXctaWQ+DQotICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgPC9uYXZpZ2F0aW9uLXJ1bGU+DQotICA8bWFuYWdlZC1iZWFuPg0KLSAgICA8bWFuYWdlZC1iZWFuLW5hbWU+bmFtZWJlYW48L21hbmFnZWQtYmVhbi1uYW1lPg0KLSAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5wb3J0bGV0LmZhY2VzLmRlbW8uaGVsbG93b3JsZC5OYW1lQmVhbjwvbWFuYWdlZC1iZWFuLWNsYXNzPg0KLSAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4NCi0gIDwvbWFuYWdlZC1iZWFuPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktcGx1dG8td2ViLWRlZmF1bHQueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS1wbHV0by13ZWItZGVmYXVsdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYWI4M2YuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS1wbHV0by13ZWItZGVmYXVsdC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3BvcnRsZXQueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9wb3J0bGV0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzMGM2ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3BvcnRsZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgkgICAKLS0tPgotPHBvcnRsZXQtYXBwIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcG9ydGxldC9wb3J0bGV0LWFwcF8xXzAueHNkIgotICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wb3J0bGV0L3BvcnRsZXQtYXBwXzFfMC54c2QgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcG9ydGxldC9wb3J0bGV0LWFwcF8xXzAueHNkIj4KLQotICA8cG9ydGxldD4KLSAgICA8ZGVzY3JpcHRpb24gbGFuZz0iRU4iPk15RmFjZXMgUG9ydGxldCBCcmlkZ2UgRGVtbyBQb3J0bGV0PC9kZXNjcmlwdGlvbj4KLSAgICA8cG9ydGxldC1uYW1lPiR7YXJ0aWZhY3RJZH08L3BvcnRsZXQtbmFtZT4KLSAgICA8ZGlzcGxheS1uYW1lIGxhbmc9IkVOIj5NeUZhY2VzIFBvcnRsZXQgQnJpZGdlIERlbW88L2Rpc3BsYXktbmFtZT4KLSAgICA8cG9ydGxldC1jbGFzcz5qYXZheC5wb3J0bGV0LmZhY2VzLkdlbmVyaWNGYWNlc1BvcnRsZXQ8L3BvcnRsZXQtY2xhc3M+Ci0KLSAgICA8aW5pdC1wYXJhbT4KLSAgICAgIDxuYW1lPmphdmF4LnBvcnRsZXQuZmFjZXMuZGVmYXVsdFZpZXdJZC52aWV3PC9uYW1lPgotICAgICAgPHZhbHVlPi9pbmRleC5qc3A8L3ZhbHVlPgotICAgIDwvaW5pdC1wYXJhbT4KLQotICAgIDxpbml0LXBhcmFtPgotICAgICAgPG5hbWU+amF2YXgucG9ydGxldC5mYWNlcy5kZWZhbHRWaWV3SWQuZWRpdDwvbmFtZT4KLSAgICAgIDx2YWx1ZT4vZWRpdC5qc3A8L3ZhbHVlPgotICAgIDwvaW5pdC1wYXJhbT4KLQotICAgIDxpbml0LXBhcmFtPgotICAgICAgPG5hbWU+amF2YXgucG9ydGxldC5mYWNlcy5kZWZhdWx0Vmlld0lkLmhlbHA8L25hbWU+Ci0gICAgICA8dmFsdWU+L2hlbHAuanNwPC92YWx1ZT4KLSAgICA8L2luaXQtcGFyYW0+Ci0KLSAgICA8c3VwcG9ydHM+Ci0gICAgICA8bWltZS10eXBlPnRleHQvaHRtbDwvbWltZS10eXBlPgotICAgICAgPHBvcnRsZXQtbW9kZT5lZGl0PC9wb3J0bGV0LW1vZGU+Ci0gICAgICA8cG9ydGxldC1tb2RlPnZpZXc8L3BvcnRsZXQtbW9kZT4KLSAgICAgIDxwb3J0bGV0LW1vZGU+aGVscDwvcG9ydGxldC1tb2RlPgotICAgIDwvc3VwcG9ydHM+Ci0KLSAgICA8c3VwcG9ydGVkLWxvY2FsZT5lbjwvc3VwcG9ydGVkLWxvY2FsZT4KLQotICAgIDxwb3J0bGV0LWluZm8+Ci0gICAgICA8dGl0bGU+TXlGYWNlcyBQb3J0bGV0IEJyaWRnZSBEZW1vPC90aXRsZT4KLSAgICAgIDxzaG9ydC10aXRsZT5CcmlkZ2UgRGVtbzwvc2hvcnQtdGl0bGU+Ci0gICAgPC9wb3J0bGV0LWluZm8+Ci0gIDwvcG9ydGxldD4NCi0gICAgCi08L3BvcnRsZXQtYXBwPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQwOWU0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdJU08tODg1OS0xJz8+Ci08IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgJy0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTicgJ2h0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCc+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0JICAgCi0tLT4KLTwhLS0gVGhlIEpldHR5IFBsdXRvIFBsdWdpbiBuZWVkcyB0byBoYXZlIGEgV2ViYXBwIDIuMyB3ZWIteG1sLiAgRG9uJ3Qga25vdyB3aHkuIC0tPgotPHdlYi1hcHA+DQotIAotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgPHBhcmFtLXZhbHVlPi5qc3A8L3BhcmFtLXZhbHVlPgotICA8L2NvbnRleHQtcGFyYW0+DQotICAKLSAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gIDwhLS0gVE9ETzogaXMgdGhpcyBuZWVkZWQgYW55bW9yZSBmb3IgamV0dHk/ICBJIGRvbid0IHRoaW5rIHNvLi4gLS0+Ci0gIDwhLS0gbGlzdGVuZXI+Ci0gICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICA8L2xpc3RlbmVyIC0tPg0KLQotICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gIDxzZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW5hbWU+ZmFjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgPC9zZXJ2bGV0PgotCi0gIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgPCEtLSAKLSAgICBJbiB0aGlzIGRlbW8gYXBwbGljYXRpb24sIEkgY2hvc2UgdG8gdXNlIHN1ZmZpeCBtYXBwaW5nLiAgSSBkaWQgdGhpcyBiZWNhdXNlIGl0IG1ha2VzIHVybHMKLSAgICBpbiB0aGUgcG9ydGxldCB3b3JsZCBsb29rIG5pY2VyIGluIHRoZSBzb3VyY2UuICBUaGUgcG9ydGxldCB1cmwgc2hvdWxkIGJlIHRoZSBzYW1lIAotICAgIHJlZ3VhcmRsZXNzLgotICAtLT4KLSAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1uYW1lPmZhY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgPC9zZXJ2bGV0LW1hcHBpbmc+DQotICAKLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2VkaXQuanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvZWRpdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3Yjc4MGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvZWRpdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxmOnZpZXc+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLSAgICAgIDx0aXRsZT5pbmRleDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjEiPgotICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IlRoaXMgaXMgdGhlIHBvcnRsZXQgZWRpdCBzY3JlZW4uIi8+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICA8L2g6Zm9ybT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwvZjp2aWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaGVsbG8uanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9oZWxsby5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MGIyZmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9oZWxsby5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxmOnZpZXc+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLSAgICAgIDx0aXRsZT5oZWxsbzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjEiPgotICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7bmFtZWJlYW4ubmFtZX0iLz4KLSAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJyZXR1cm4iIGFjdGlvbj0iaGVsbG9Xb3JsZCIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgPC9oOmZvcm0+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L2Y6dmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb3dvcmxkL2luZGV4LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjU3NDNhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08Zjp2aWV3PgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci0gICAgICA8dGl0bGU+aW5kZXg8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIxIj4KLSAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+Ci0gICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJQbGVhc2UgZW50ZXIgeW91ciBuYW1lOiAiLz4KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCB2YWx1ZT0iI3tuYW1lYmVhbi5uYW1lfSIvPgotICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iQ2xpY2sgSGVyZSIgYWN0aW9uPSJzYXloZWxsbyIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgPC9oOmZvcm0+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L2Y6dmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxwLmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbHAuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzg3YzE4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbHAuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08Zjp2aWV3PgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci0gICAgICA8dGl0bGU+aW5kZXg8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIxIj4KLSAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJUaGlzIGlzIHRoZSBwb3J0bGV0IGhlbHAgc2NyZWVuLiIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgPC9oOmZvcm0+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L2Y6dmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZTIwZTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08Zjp2aWV3PgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci0gICAgICA8dGl0bGU+aW5kZXg8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIxIj4KLSAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJQbGVhc2Ugc2VsZWN0OiIvPgotICAgICAgICAgIDxoOnBhbmVsR3JvdXA+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iSGVsbG9Xb3JsZCBleGFtcGxlIiBhY3Rpb249ImhlbGxvV29ybGQiLz4KLSAgICAgICAgICAgICAgPC9saT4NCi0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvaDpwYW5lbEdyb3VwPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgPC9oOmZvcm0+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L2Y6dmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL05PVElDRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjhmNTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+TXlGYWNlcyBCYXNpYyBBcmNoZXR5cGU8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBuZXcgd2ViYXBwIGJhc2VkIG9uIG15ZmFjZXM8L2Rlc2NyaXB0aW9uPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYXJjaGV0eXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZWZmYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAKLSBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yOiBncmFudHNtaXRoICQpCi0gQHZlcnNpb24gJFJldmlzaW9uOiA0NzI1NjAgJCAkRGF0ZTogMjAwNi0xMS0wOCAxODo0NToyNSArMDEwMCAoTWksIDA4IE5vdiAyMDA2KSAkCi0gCi0tLT4KLQotPGFyY2hldHlwZT4KLSAgPGlkPm15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQ8L2lkPgotICA8cmVzb3VyY2VzPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2luZGV4LmpzcDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbDwvcmVzb3VyY2U+Ci0gIDwvcmVzb3VyY2VzPgotPC9hcmNoZXR5cGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVhMTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPG5hbWU+QSBjdXN0b20gcHJvamVjdCB1c2luZyBteWZhY2VzPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5teW9yZ2FuaXphdGlvbi5vcmc8L3VybD4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGZpbmFsTmFtZT4ke2FydGlmYWN0SWR9PC9maW5hbE5hbWU+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLW1hdmVuLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8IS0tIFByb2plY3QgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4gICAgCi0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPiAgICAKLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgCi0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+NC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjIyODliLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIgewotCi0gICAgCi0gICAgLy9wcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCl7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCl7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2ZGEwYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2ZvciBkZWJ1Z2dpbmcgbG9nNGogaXRzZWxmCi1sb2c0ai5kZWJ1Zz1mYWxzZQotCi0jTG9nZ2VyLVByaW9yaXRpZXM6Ci0jREVCVUcgbG93ZXN0LCBwcmludHMgYWxsIG1lc3NhZ2VzCi0jSU5GTyAgcHJpbnRzIGFsbCBtZXNzYWdlcyB3aXRoIEZBVEFMLCBFUlJPUiwgV0FSTiBvciBJTkZPIHByaW9yaXR5Ci0jV0FSTiAgcHJpbnRzIGFsbCBtZXNzYWdlcyB3aXRoIEZBVEFMLCBFUlJPUiBvciBXQVJOIHByaW9yaXR5Ci0jRVJST1IgcHJpbnRzIGFsbCBtZXNzYWdlcyB3aXRoIEZBVEFMIG9yIEVSUk9SIHByaW9yaXR5Ci0jRkFUQUwgaGlnaGVzdCwgcHJpbnRzIG9ubHkgRkFUQUwgbWVzc2FnZXMKLQotIyByb290IGxvZ2dlcgotbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBBMQotbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgLSAlbSVuCi0KLSMgbXlmYWNlcyBsb2dnZXIKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm15ZmFjZXM9SU5GTwpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjk4ZDY2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYWQ0MWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbS0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yIHNlbGVjdCBlbGVtZW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nIFN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgICAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cwotICAgICAgICAgICAgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DSEVDS19FWFRFTlNJT05TX0ZJTFRFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPCEtLSBFeHRlbnNpb25zIEZpbHRlciAtLT4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5maWx0ZXIuRXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5TZXQgdGhlIHNpemUgbGltaXQgZm9yIHVwbG9hZGVkIGZpbGVzLgotICAgICAgICAgICAgICAgIEZvcm1hdDogMTAgLSAxMCBieXRlcwotICAgICAgICAgICAgICAgIDEwayAtIDEwIEtCCi0gICAgICAgICAgICAgICAgMTBtIC0gMTAgTUIKLSAgICAgICAgICAgICAgICAxZyAtIDEgR0I8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+dXBsb2FkTWF4RmlsZVNpemU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+MTAwbTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+U2V0IHRoZSB0aHJlc2hvbGQgc2l6ZSAtIGZpbGVzCi0gICAgICAgICAgICAgICAgYmVsb3cgdGhpcyBsaW1pdCBhcmUgc3RvcmVkIGluIG1lbW9yeSwgZmlsZXMgYWJvdmUKLSAgICAgICAgICAgICAgICB0aGlzIGxpbWl0IGFyZSBzdG9yZWQgb24gZGlzay4KLQotICAgICAgICAgICAgICAgIEZvcm1hdDogMTAgLSAxMCBieXRlcwotICAgICAgICAgICAgICAgIDEwayAtIDEwIEtCCi0gICAgICAgICAgICAgICAgMTBtIC0gMTAgTUIKLSAgICAgICAgICAgICAgICAxZyAtIDEgR0I8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+dXBsb2FkVGhyZXNob2xkU2l6ZTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4xMDBrPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5leHRlbnNpb25zRmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNGQ3My4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Im5hbWUiIHZhbHVlPSJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIiAvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5uYW1lfSIgcmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlcyBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWMyMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDEyYzQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5uYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMiLz48L2gyPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+Ci0gICAgICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgICAgICAgICA8L2g6Y29tbWFuZExpbms+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiMWIyMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0gLS0tLS0tDQotIE15ZmFjZXMgSGVsbG9Xb3JsZCBBcmNoZXR5cGUNCi0gLS0tLS0tDQotDQotT3ZlcnZpZXcNCi0NCi0gIFRoaXMgcHJvamVjdCBkZWZpbmVzIGEgTWF2ZW4gYXJjaGV0eXBlIHBsdWdpbi4gUnVubmluZyB0aGUgcGx1Z2luIHdpbGwgY3JlYXRlIGEgZGlyZWN0b3J5IHRyZWUNCi0gIGNvbnRhaW5pbmcgdGhlIGZpbGVzIG5lZWRlZCB0byBxdWlja2x5IGdldCBzdGFydGVkIG9uIGEgbmV3IEpTRiBwcm9qZWN0IHdoaWNoIHVzZXMgSlNQIGFzIHRoZQ0KLSAgdGVtcGxhdGluZyBsYW5ndWFnZS4NCi0NCi1Vc2FnZQ0KLQ0KLSAgVE9ETzogd3JpdGVtZQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZGQ0Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkpTRiBDb21wb25lbnQgTGlicmFyeSBBcmNoZXR5cGU8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBsaWJhcnkgcHJvamVjdCBvZiBKU0YgY29tcG9uZW50czwvZGVzY3JpcHRpb24+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYXJjaGV0eXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3ZmI1OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAKLSBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yOiBncmFudHNtaXRoICQpCi0gQHZlcnNpb24gJFJldmlzaW9uOiA0NzI1NjAgJCAkRGF0ZTogMjAwNi0xMS0wOCAxODo0NToyNSArMDEwMCAoTWksIDA4IE5vdiAyMDA2KSAkCi0gCi0tLT4KLQotPGFyY2hldHlwZT4KLSAgICA8aWQ+bXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czwvaWQ+Ci0gICAgPHJlc291cmNlcz4KLSAgICAgICAgPHJlc291cmNlPmV4YW1wbGVzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvYnVpbGQucHJvcGVydGllczwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9TYXlIZWxsb0JlYW4uamF2YTwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG8uanNwPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmV4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3A8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+ZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmV4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9ob21lLmpzcDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5leGFtcGxlcy9wb20ueG1sPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWw8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+Y29yZS9zcmMvbWFpbi90bGQvZW50aXRpZXMvc2F5X2hlbGxvX2F0dHJpYnV0ZXMueG1sPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vdGxkL2VudGl0aWVzL3VpX2NvbXBvbmVudF9hdHRyaWJ1dGVzLnhtbDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3NyYy9tYWluL3RsZC9taXNjL3Jlc29sdmVfZW50aXRpZXMueHNsPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vdGxkL21pc2Mvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3NyYy9tYWluL3RsZC9taXNjL3Jlc29sdmVfZW50aXRpZXMtdGxkZG9jLnhzbDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3NyYy9tYWluL3RsZC9teWNvbXBvbmVudHMudGxkPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvLmphdmE8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+Y29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlci5qYXZhPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvVGFnLmphdmE8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+Y29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlclRlc3QuamF2YTwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3BvbS54bWw8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotPC9hcmNoZXR5cGU+Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk5Y2RlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfS1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+TXkgSlNGIENvbXBvbmVudHMgTGlicmFyeTwvbmFtZT4KLQotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBteSBzdXBlciBqc2YgY29tcG9uZW50cyBsaWJyYXJ5LgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9LXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotCi0gICAgICAgIDwhLS0gY29tcGlsZSAtLT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtdmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy12YWxpZGF0b3I8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gcHJvdmlkZWQgZGVwZW5kZW5jaWVzIC0tPgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS41PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgICAgIDwhLS0gdGVzdCBkZXBlbmRlbmNpZXMgLS0+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnN0cnV0cy5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4JCQotICAgICAgICA8L2RlcGVuZGVuY3k+ICAgICAgICAKLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eHNsdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNsRmlsZT5zcmMvbWFpbi90bGQvbWlzYy9yZXNvbHZlX2VudGl0aWVzLnhzbDwveHNsRmlsZT4KLSAgICAgICAgICAgICAgICAgICAgPHNyY0luY2x1ZGVzPioqLyoudGxkPC9zcmNJbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPHNyY0Rpcj5zcmMvbWFpbi90bGQ8L3NyY0Rpcj4KLSAgICAgICAgICAgICAgICAgICAgPGRlc3REaXI+dGFyZ2V0L2NsYXNzZXMvTUVUQS1JTkY8L2Rlc3REaXI+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRyYW5zZm9ybTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoYW5nZWxvZy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLWJldGEtMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8cmVwb3J0U2V0cz4KLSAgICAgICAgICAgICAgICAgICAgPHJlcG9ydFNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5kdWFsLXJlcG9ydDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5yYW5nZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFuZ2U+MzA8L3JhbmdlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5jaGFuZ2Vsb2c8L3JlcG9ydD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PmZpbGUtYWN0aXZpdHk8L3JlcG9ydD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PmRldi1hY3Rpdml0eTwvcmVwb3J0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgotICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KLSAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLWJldGEtMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp4ci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD50YWdsaXN0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAtYmV0YS0xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8dGFncz5UT0RPLCBGSVhNRSwgWFhYLCBAZGVwcmVjYXRlZDwvdGFncz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdXJlZmlyZS1yZXBvcnQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eHNsdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGxkLWZvci10bGRkb2M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50cmFuc2Zvcm08L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbEZpbGU+c3JjL21haW4vdGxkL21pc2MvcmVzb2x2ZV9lbnRpdGllcy10bGRkb2MueHNsPC94c2xGaWxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNyY0luY2x1ZGVzPioqLyoudGxkPC9zcmNJbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcmNEaXI+c3JjL21haW4vdGxkPC9zcmNEaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzdERpcj50YXJnZXQvdGxkZG9jLXNpdGU8L2Rlc3REaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGxkLWZvci1qYXI8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50cmFuc2Zvcm08L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbEZpbGU+c3JjL21haW4vdGxkL21pc2MvcmVzb2x2ZV9lbnRpdGllcy54c2w8L3hzbEZpbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3JjSW5jbHVkZXM+KiovKi50bGQ8L3NyY0luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNyY0Rpcj5zcmMvbWFpbi90bGQ8L3NyY0Rpcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXN0RGlyPnRhcmdldC9jbGFzc2VzL01FVEEtSU5GPC9kZXN0RGlyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLQotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5uZXQuc291cmNlZm9yZ2UubWF2ZW4tdGFnbGliPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tdGFnbGliLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWdsaWIuc3JjLmRpcj4ke2Jhc2VkaXJ9L3RhcmdldC90bGRkb2Mtc2l0ZTwvdGFnbGliLnNyYy5kaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRsZERvY0Rpcj4ke2Jhc2VkaXJ9L3RhcmdldC9zaXRlL3RsZGRvYzwvdGxkRG9jRGlyPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L3JlcG9ydGluZz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPnBlcmZvcm1SZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eHNsdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGxkLWZvci10bGRkb2M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50cmFuc2Zvcm08L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbEZpbGU+c3JjL21haW4vdGxkL21pc2MvcmVzb2x2ZV9lbnRpdGllcy10bGRkb2MueHNsPC94c2xGaWxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNyY0luY2x1ZGVzPioqLyoudGxkPC9zcmNJbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcmNEaXI+c3JjL21haW4vdGxkPC9zcmNEaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzdERpcj50YXJnZXQvdGxkZG9jLXNpdGU8L2Rlc3REaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGxkLWZvci1qYXI8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50cmFuc2Zvcm08L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbEZpbGU+c3JjL21haW4vdGxkL21pc2MvcmVzb2x2ZV9lbnRpdGllcy54c2w8L3hzbEZpbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3JjSW5jbHVkZXM+KiovKi50bGQ8L3NyY0luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNyY0Rpcj5zcmMvbWFpbi90bGQ8L3NyY0Rpcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXN0RGlyPnRhcmdldC9jbGFzc2VzL01FVEEtSU5GPC9kZXN0RGlyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+PGdvYWw+amFyPC9nb2FsPjwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bmV0LnNvdXJjZWZvcmdlLm1hdmVuLXRhZ2xpYjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXRhZ2xpYi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFnbGliLnNyYy5kaXI+JHtiYXNlZGlyfS90YXJnZXQvdGxkZG9jLXNpdGU8L3RhZ2xpYi5zcmMuZGlyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bGREb2NEaXI+JHtiYXNlZGlyfS90YXJnZXQvdGxkZG9jPC90bGREb2NEaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+PGdvYWw+dGFnbGliZG9jamFyPC9nb2FsPjwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2ZkYjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJT3V0cHV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsKLQotLyoqCi0gKiBUaGUgc2F5SGVsbG8gY29tcG9uZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTYXlIZWxsbyBleHRlbmRzIFVJT3V0cHV0Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1RZUEUgPSAib3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFTkRFUkVSX1RZUEUgPSAib3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvUmVuZGVyZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9GQU1JTFkgPSAiamF2YXguZmFjZXMuT3V0cHV0IjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTYXlIZWxsbygpCi0gICAgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseSgpCi0gICAgewotICAgICAgICByZXR1cm4gQ09NUE9ORU5UX0ZBTUlMWTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoRmFjZXNDb250ZXh0IGNvbnRleHQsIE9iamVjdCBzdGF0ZSkgewotICAgICAgICBPYmplY3QgdmFsdWVzW10gPSAoT2JqZWN0W10pc3RhdGU7Ci0gICAgICAgIHN1cGVyLnJlc3RvcmVTdGF0ZShjb250ZXh0LCB2YWx1ZXNbMF0pOwotCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gKFN0cmluZyl2YWx1ZXNbMV07Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSAoU3RyaW5nKXZhbHVlc1syXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNhdmVTdGF0ZShGYWNlc0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBPYmplY3QgdmFsdWVzW10gPSBuZXcgT2JqZWN0WzNdOwotICAgICAgICB2YWx1ZXNbMF0gPSBzdXBlci5zYXZlU3RhdGUoY29udGV4dCk7Ci0gICAgICAgIHZhbHVlc1sxXSA9IGZpcnN0TmFtZTsKLSAgICAgICAgdmFsdWVzWzJdID0gbGFzdE5hbWU7Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgaWYgKGZpcnN0TmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gZ2V0VmFsdWVCaW5kaW5nKCJmaXJzdE5hbWUiKTsKLSAgICAgICAgcmV0dXJuICh2YiA9PSBudWxsKT8gbnVsbCA6IChTdHJpbmcpIHZiLmdldFZhbHVlKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmIChsYXN0TmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBnZXRWYWx1ZUJpbmRpbmcoImxhc3ROYW1lIik7Ci0gICAgICAgIHJldHVybiAodmIgPT0gbnVsbCk/IG51bGwgOiAoU3RyaW5nKSB2Yi5nZXRWYWx1ZShGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXIuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjAzNTY4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvOwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVGhlIHJlbmRlcmVyIGZvciBteSBjb21wb25lbnQKLSAqLwotcHVibGljIGNsYXNzIFNheUhlbGxvUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgc3VwZXIuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAvLyBub3RoaW5nIHRvIGRlY29kZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAvLyBubyBuZWVkIHRvIHVzZSBlbmNvZGVCZWdpbi4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgLy8gdGhpcyBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBjaGlsZHJlbgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCF1aUNvbXBvbmVudC5pc1JlbmRlcmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc3BvbnNlV3JpdGVyIHdyaXRlciA9IGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZVdyaXRlcigpOwotCi0gICAgICAgIFNheUhlbGxvIHNheUhlbGxvID0gKFNheUhlbGxvKSB1aUNvbXBvbmVudDsKLQotICAgICAgICBTdHJpbmcgZmlyc3ROYW1lID0gc2F5SGVsbG8uZ2V0Rmlyc3ROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsYXN0TmFtZSA9IHNheUhlbGxvLmdldExhc3ROYW1lKCk7Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCJIZWxsbyAiKTsKLQotICAgICAgICBpZiAoZmlyc3ROYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZShmaXJzdE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhc3ROYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiICIrbGFzdE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCIhIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1RhZy5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmMwZDlhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9UYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsbzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRUYWc7Ci0KLS8qKgotICogVGhlIHRhZyBmb3IgbXkgY29tcG9uZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTYXlIZWxsb1RhZyBleHRlbmRzIFVJQ29tcG9uZW50VGFnCi17Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudFRhZyNnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNheUhlbGxvLkNPTVBPTkVOVF9UWVBFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnI2dldFJlbmRlcmVyVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlclR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNheUhlbGxvLkRFRkFVTFRfUkVOREVSRVJfVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudFRhZyNzZXRQcm9wZXJ0aWVzCi0gICAgICovCi0gICAgIHByb3RlY3RlZCB2b2lkIHNldFByb3BlcnRpZXMoVUlDb21wb25lbnQgY29tcG9uZW50KSB7Ci0gICAgICAgICAgc3VwZXIuc2V0UHJvcGVydGllcyhjb21wb25lbnQpOwotCi0gICAgICAgICBGYWNlc0NvbnRleHQgY29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbigpOwotCi0gICAgICAgIC8vIGZpcnN0TmFtZQotICAgICAgICBpZiAoVUlDb21wb25lbnRUYWcuaXNWYWx1ZVJlZmVyZW5jZShmaXJzdE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnQuc2V0VmFsdWVCaW5kaW5nKCJmaXJzdE5hbWUiLCBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoZmlyc3ROYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnQuZ2V0QXR0cmlidXRlcygpLnB1dCgiZmlyc3ROYW1lIiwgZmlyc3ROYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxhc3ROYW1lCi0gICAgICAgIGlmIChsYXN0TmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoVUlDb21wb25lbnRUYWcuaXNWYWx1ZVJlZmVyZW5jZShsYXN0TmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50LnNldFZhbHVlQmluZGluZygibGFzdE5hbWUiLCBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcobGFzdE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0QXR0cmlidXRlcygpLnB1dCgibGFzdE5hbWUiLCBsYXN0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBzdXBlci5yZWxlYXNlKCk7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gbnVsbDsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWFmNGZjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjEvL0VOIgotICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCI+Ci0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iPgotCi0gIDwhLS0gY29tcG9uZW50cyAtLT4KLQotICA8Y29tcG9uZW50PgotICAgIDxjb21wb25lbnQtdHlwZT5vcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG88L2NvbXBvbmVudC10eXBlPgotICAgIDxjb21wb25lbnQtY2xhc3M+b3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsby5TYXlIZWxsbzwvY29tcG9uZW50LWNsYXNzPgotICA8L2NvbXBvbmVudD4KLQotCi0gIDwhLS0gcmVuZGVya2l0IC0tPgotCi0gIDxyZW5kZXIta2l0PgotCi0gICAgPHJlbmRlcmVyPgotICAgICAgPGNvbXBvbmVudC1mYW1pbHk+amF2YXguZmFjZXMuT3V0cHV0PC9jb21wb25lbnQtZmFtaWx5PgotICAgICAgPHJlbmRlcmVyLXR5cGU+b3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvUmVuZGVyZXI8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICA8cmVuZGVyZXItY2xhc3M+b3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsby5TYXlIZWxsb1JlbmRlcmVyPC9yZW5kZXJlci1jbGFzcz4KLSAgICA8L3JlbmRlcmVyPgotCi0gIDwvcmVuZGVyLWtpdD4KLQotPC9mYWNlcy1jb25maWc+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50YWdsaWIueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWNvbXBvbmVudHMudGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3YmQxMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotPGZhY2VsZXQtdGFnbGliPgotCTxuYW1lc3BhY2U+aHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50czwvbmFtZXNwYWNlPgotCQotCTx0YWc+Ci0JCTx0YWctbmFtZT5zYXlIZWxsbzwvdGFnLW5hbWU+Ci0JCTxjb21wb25lbnQ+Ci0JCQk8Y29tcG9uZW50LXR5cGU+b3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvPC9jb21wb25lbnQtdHlwZT4KLQkJCTxyZW5kZXJlci10eXBlPm9yZy5teW9yZ2FuaXphdGlvbi5TYXlIZWxsb1JlbmRlcmVyPC9yZW5kZXJlci10eXBlPgotCQk8L2NvbXBvbmVudD4KLQk8L3RhZz4KLTwvZmFjZWxldC10YWdsaWI+IApkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3RsZC9lbnRpdGllcy9zYXlfaGVsbG9fYXR0cmlidXRlcy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL2VudGl0aWVzL3NheV9oZWxsb19hdHRyaWJ1dGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxODVlYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL2VudGl0aWVzL3NheV9oZWxsb19hdHRyaWJ1dGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhLS0gVGhpcyBpcyB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgc2F5SGVsbG8gY29tcG9uZW50IC0tPgotPGF0dHJpYnV0ZT4KLSAgICA8bmFtZT5maXJzdE5hbWU8L25hbWU+Ci0gICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhlIGZpcnN0IG5hbWUgb2YgdGhlIHVzZXIKLSAgICA8L2Rlc2NyaXB0aW9uPgotPC9hdHRyaWJ1dGU+Ci08YXR0cmlidXRlPgotICAgIDxuYW1lPmxhc3ROYW1lPC9uYW1lPgotICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBsYXN0IG5hbWUgb2YgdGhlIHVzZXIKLSAgICA8L2Rlc2NyaXB0aW9uPgotPC9hdHRyaWJ1dGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3RsZC9lbnRpdGllcy91aV9jb21wb25lbnRfYXR0cmlidXRlcy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL2VudGl0aWVzL3VpX2NvbXBvbmVudF9hdHRyaWJ1dGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExM2NhZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL2VudGl0aWVzL3VpX2NvbXBvbmVudF9hdHRyaWJ1dGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTxhdHRyaWJ1dGU+Ci0gICAgPG5hbWU+aWQ8L25hbWU+Ci0gICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGUgZGV2ZWxvcGVyLWFzc2lnbmVkIElEIG9mIHRoaXMgY29tcG9uZW50LiAgVGhlIElEIG11c3QgYmUgdW5pcXVlCi0gICAgICAgIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHRhZydzIGVuY2xvc2luZyBuYW1pbmcgY29udGFpbmVyIChlLmcuCi0gICAgICAgIGg6Zm9ybSBvciBmOnN1YnZpZXcpLiAgVGhpcyB2YWx1ZSBtdXN0IGJlIGEgc3RhdGljIHZhbHVlLgotICAgIDwvZGVzY3JpcHRpb24+Ci08L2F0dHJpYnV0ZT4KLQotPGF0dHJpYnV0ZT4KLSAgICA8bmFtZT5iaW5kaW5nPC9uYW1lPgotICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgSWRlbnRpZmllcyBhIGJhY2tpbmcgYmVhbiBwcm9wZXJ0eSAob2YgdHlwZSBVSUNvbXBvbmVudCBvciBhcHByb3ByaWF0ZQotICAgICAgICBzdWJjbGFzcykgdG8gYmluZCB0byB0aGlzIGNvbXBvbmVudCBpbnN0YW5jZS4gIFRoaXMgdmFsdWUgbXVzdCBiZSBhbgotICAgICAgICBFTCBleHByZXNzaW9uLgotICAgIDwvZGVzY3JpcHRpb24+Ci08L2F0dHJpYnV0ZT4KLQotPGF0dHJpYnV0ZT4KLSAgICA8bmFtZT5yZW5kZXJlZDwvbmFtZT4KLSAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgYm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgY29tcG9uZW50IHNob3VsZCBiZSByZW5kZXJlZC4KLSAgICAgICAgRGVmYXVsdCB2YWx1ZTogdHJ1ZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotPC9hdHRyaWJ1dGU+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL21pc2MvcmVzb2x2ZV9lbnRpdGllcy10bGRkb2MueHNsIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3RsZC9taXNjL3Jlc29sdmVfZW50aXRpZXMtdGxkZG9jLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkODRkYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL21pc2MvcmVzb2x2ZV9lbnRpdGllcy10bGRkb2MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICAtIFN0eWxlc2hlZXQgdG8gZXhwYW5kIHhtbCBlbnRpdHkgcmVmZXJlbmNlcyBpbmxpbmUuIAotICAtIAotICAtIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gdGhlIHRsZGRvYyBhcHBsaWNhdGlvbiB3aGljaCBtZWFucyB0aGF0Ci0gIC0gYSAodmFsaWQpIHhtbG5zIGF0dHJpYnV0ZSBpcyByZWplY3RlZDsgdGxkZG9jIHYxLjMgb25seSBhY2NlcHRzIGlucHV0IHRoYXQgKGluY29ycmVjdGx5KQotICAtIHB1dHMgdGhlIHRsZCBlbGVtZW50cyBpbiBubyBuYW1lc3BhY2UuIFRoaXMgc3R5bGVzaGVldCB0aGVyZWZvcmUgZ2VuZXJhdGVzIGEgc3BlY2lhbAotICAtIHZlcnNpb24gb2YgdGhlIHRsZCBmb3IgZmVlZGluZyB0byB0aGUgdGxkZG9jIGFwcCwgdW50aWwgc3VjaCB0aW1lIGFzIHRsZGRvYyBpcyBmaXhlZC4KLSAgLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4xIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQotICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIKLSAgICAgIGVuY29kaW5nPSJJU08tODg1OS0xIgotICAgICAgZG9jdHlwZS1wdWJsaWM9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIKLSAgICAgIGRvY3R5cGUtc3lzdGVtPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIgotICAgICAgaW5kZW50PSJ5ZXMiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIiBwcmlvcml0eT0iMiI+Ci0gICAgPCEtLSBhdm9pZGluZyBjb3B5IHRvIGdldCBnZXQgcmlkIG9mIG5hbWVzcGFjZSBhdHRyaWJ1dGUgLS0+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9IntuYW1lKC4pfSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi90bGQvbWlzYy9yZXNvbHZlX2VudGl0aWVzLnhzbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi90bGQvbWlzYy9yZXNvbHZlX2VudGl0aWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmZDNhYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL21pc2MvcmVzb2x2ZV9lbnRpdGllcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIC0gU3R5bGVzaGVldCB0byBwcmV0dHktcHJpbnQgYW4geG1sIGRvY3VtZW50LiBJbiBhZGRpdGlvbiwgaWYgdGhlIGlucHV0Ci0gIC0gZG9jdW1lbnQgY29udGFpbnMgYW55IHhtbCBlbnRpdHkgcmVmZXJlbmNlcywgdGhlbiB0aG9zZSBhcmUgZXhwYW5kZWQKLSAgLSBpbmxpbmUuCi0gIC0KLSAgLSBCYXNlZCBvbiBhIHN0eWxlc2hlZXQgYnkgSm9obiBNb25nYW4uCi0gIC0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMSIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIKLSAgICAgICAgICAgICAgICBlbmNvZGluZz0iSVNPLTg4NTktMSIKLSAgICAgICAgICAgICAgICBkb2N0eXBlLXB1YmxpYz0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgotICAgICAgICAgICAgICAgIGRvY3R5cGUtc3lzdGVtPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIi8+Ci0KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImluZGVudC1pbmNyZW1lbnQiIHNlbGVjdD0iJyAgICciIC8+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIj4KLSAgICAgIDx4c2w6cGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IicmI3hBOyciLz4KLQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4KLSAgICAgIDx4c2w6Y29weT4KLSAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCoiIC8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiCi0gICAgICAgICAgICAgICBzZWxlY3Q9ImNvbmNhdCgkaW5kZW50LCAkaW5kZW50LWluY3JlbWVudCkiLz4KLSAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IioiPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgPC94c2w6Y29weT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tbWVudCgpfHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSI+Ci0gICAgICA8eHNsOnBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSInJiN4QTsnIi8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPgotICAgICAgPHhzbDpjb3B5IC8+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgPCEtLSAKLSAgICAgLSBEaXNjYXJkIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBub2RlIHdoZXJlIHRoZSB0ZXh0IGNvbnRlbnQKLSAgICAgLSBpcyBub3RoaW5nIGJ1dCB3aGl0ZXNwYWNlLiBXaGVuIHRoaXMgcnVsZSBpc24ndCBtYXRjaGVkCi0gICAgIC0gdGhlIGRlZmF1bHQgeG1sIHByb2Nlc3NpbmcgYXBwbGllcywgd2hpY2ggaXMgdG8gY29weSB0aGUKLSAgICAgLSB0ZXh0IGRpcmVjdGx5IHRvIHRoZSBvdXRwdXQuCi0gICAgIC0KLSAgICAgLSBXQVJOSU5HOiB0aGlzIGlzIGRhbmdlcm91cy4gSGFuZGxlIHdpdGggY2FyZSAKLSAgICAgLS0+Ci0gICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KClbbm9ybWFsaXplLXNwYWNlKC4pPScnXSIvPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3RsZC9taXNjL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL21pc2Mvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2ZmI3Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL21pc2Mvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLQotICAgVGhpcyBpcyB0aGUgRFREIGRlZmluaW5nIHRoZSBKYXZhU2VydmVyIFBhZ2VzIDEuMiBUYWcgTGlicmFyeQotICAgZGVzY3JpcHRvciAoLnRsZCkgKFhNTCkgZmlsZSBmb3JtYXQvc3ludGF4LgotCi0gICBBIFRhZyBMaWJyYXJ5IGlzIGEgSkFSIGZpbGUgY29udGFpbmluZyBhIHZhbGlkIGluc3RhbmNlIG9mIGEgVGFnIExpYnJhcnkKLSAgIERlc2NyaXB0b3IgKHRhZ2xpYi50bGQpIGZpbGUgaW4gdGhlIE1FVEEtSU5GIHN1YmRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aGUKLSAgIGFwcHJvcHJpYXRlIGltcGxlbWVudGluZyBjbGFzc2VzLCBhbmQgb3RoZXIgcmVzb3VyY2VzIHJlcXVpcmVkIHRvCi0gICBpbXBsZW1lbnQgdGhlIHRhZ3MgZGVmaW5lZCB0aGVyZWluLgotCi0gIC0tPgotCi08IU5PVEFUSU9OIFdFQi1KU1BUQUdMSUIuMV8yIFBVQkxJQwotICAgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgSlNQIDEuMiBUYWcgTGlicmFyeSBEZXNjcmlwdG9yLgotQWxsIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSB0YWdsaWIKLSAgICAgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgotCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYiAodGxpYi12ZXJzaW9uLCBqc3AtdmVyc2lvbiwgc2hvcnQtbmFtZSwgdXJpPywKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LCBsYXJnZS1pY29uPywgZGVzY3JpcHRpb24/LAotICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yPywgbGlzdGVuZXIqLCB0YWcrKSA+Ci0KLTwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQKLQkgIHhtbG5zIENEQVRBICNGSVhFRAotCQkiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvVGFnTGlicmFyeURlc2NyaXB0b3IiPgotCi08IUVMRU1FTlQgdGxpYi12ZXJzaW9uICgjUENEQVRBKSA+Ci08IUVMRU1FTlQganNwLXZlcnNpb24gICgjUENEQVRBKSA+Ci08IUVMRU1FTlQgc2hvcnQtbmFtZSAgICAgICgjUENEQVRBKSA+Ci08IUVMRU1FTlQgdXJpCSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uCSgjUENEQVRBKSA+Ci08IUVMRU1FTlQgdmFsaWRhdG9yICh2YWxpZGF0b3ItY2xhc3MsIGluaXQtcGFyYW0qLCBkZXNjcmlwdGlvbj8pID4KLTwhRUxFTUVOVCB2YWxpZGF0b3ItY2xhc3MgKCNQQ0RBVEEpID4KLTwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLTwhRUxFTUVOVCBwYXJhbS1uYW1lICgjUENEQVRBKT4KLTwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgbGlzdGVuZXIgKGxpc3RlbmVyLWNsYXNzKSA+Ci08IUVMRU1FTlQgbGlzdGVuZXItY2xhc3MgKCNQQ0RBVEEpID4KLTwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZy1jbGFzcywgdGVpLWNsYXNzPywgYm9keS1jb250ZW50PywgZGlzcGxheS1uYW1lPywKLSAgICAgICAgICAgICAgIHNtYWxsLWljb24/LCBsYXJnZS1pY29uPywgZGVzY3JpcHRpb24/LCB2YXJpYWJsZSosIGF0dHJpYnV0ZSosCi0gICAgICAgICAgICAgICBleGFtcGxlPykgPgotPCFFTEVNRU5UIHRhZy1jbGFzcyAoI1BDREFUQSkgPgotPCFFTEVNRU5UIHRlaS1jbGFzcyAoI1BDREFUQSkgPgotPCFFTEVNRU5UIGJvZHktY29udGVudCAoI1BDREFUQSkgPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpID4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKSA+Ci08IUVMRU1FTlQgZXhhbXBsZSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIHZhcmlhYmxlICggKG5hbWUtZ2l2ZW4gfCBuYW1lLWZyb20tYXR0cmlidXRlKSwgdmFyaWFibGUtY2xhc3M/LAotICAgICAgICAgICAgICAgICAgICBkZWNsYXJlPywgc2NvcGU/LCBkZXNjcmlwdGlvbj8pID4KLTwhRUxFTUVOVCBuYW1lLWdpdmVuICgjUENEQVRBKSA+Ci08IUVMRU1FTlQgbmFtZS1mcm9tLWF0dHJpYnV0ZSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIHZhcmlhYmxlLWNsYXNzICgjUENEQVRBKSA+Ci08IUVMRU1FTlQgZGVjbGFyZSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIHNjb3BlICgjUENEQVRBKSA+Ci08IUVMRU1FTlQgYXR0cmlidXRlIChuYW1lLCByZXF1aXJlZD8gLCBydGV4cHJ2YWx1ZT8sIHR5cGU/LCBkZXNjcmlwdGlvbj8pID4KLTwhRUxFTUVOVCBuYW1lCSgjUENEQVRBKSA+Ci08IUVMRU1FTlQgcmVxdWlyZWQgICAgKCNQQ0RBVEEpID4KLTwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIHR5cGUgKCNQQ0RBVEEpID4KLQotPCEtLSBJRCBhdHRyaWJ1dGVzIC0tPgotCi08IUFUVExJU1QgdGxpYi12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGpzcC12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNob3J0LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4YW1wbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZy1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0ZWktY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYm9keS1jb250ZW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGFyYW0tdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXItY2xhc3MgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL215Y29tcG9uZW50cy50bGQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vdGxkL215Y29tcG9uZW50cy50bGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZGMzOTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3RsZC9teWNvbXBvbmVudHMudGxkCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLQotPCFET0NUWVBFIHRhZ2xpYgotICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIKLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiIFsKLQotPCEtLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1NeSBjb21wb25lbnQgZW50aXRpZXMuIFdvcmtpbmcgd2l0aCBlbnRpdGllcyBhbGxvd3MgYSBtb3JlIGNsZWFyIHN0cnVjdHVyZQotb2YgdGhlIHRsZCBmaWxlIGFuZCB0aGUgcG9zc2liaWxpdHkgdG8gcmV1c2UgYXR0cmlidXRlcyB3aXRob3V0IGhhdmluZyB0bwotcmV3cml0ZSB0aGVtIGFnYWluLgotV2hlbiBhZGRpbmcgYSBuZXcgY29tcG9uZW50IG9yIGNyZWF0aW5nL21vZGlmeWluZyBhdHRyaWJ1dGVzIGZvciBhbiBleGlzdGluZwotY29tcG9uZW50LCBjcmVhdGUgb3IgbW9kaWZ5IHRoZSBjb3JyZXNwb25kaW5nICdlbnRpdGllcycgZmlsZSBpbiB0aGUgZW50aXRpZXMKLWZvbGRlci4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0+Ci08IUVOVElUWSB1aV9jb21wb25lbnRfYXR0cmlidXRlcyAgICAgICBTWVNURU0gImVudGl0aWVzL3VpX2NvbXBvbmVudF9hdHRyaWJ1dGVzLnhtbCI+Ci08IUVOVElUWSBzYXlfaGVsbG9fYXR0cmlidXRlcyAgICAgICBTWVNURU0gImVudGl0aWVzL3NheV9oZWxsb19hdHRyaWJ1dGVzLnhtbCI+Ci1dPgotCi08dGFnbGliPgotCi0gICAgPHRsaWItdmVyc2lvbj4xLjA8L3RsaWItdmVyc2lvbj4KLSAgICA8anNwLXZlcnNpb24+MS4yPC9qc3AtdmVyc2lvbj4KLSAgICA8c2hvcnQtbmFtZT5teWNvbXA8L3Nob3J0LW5hbWU+Ci0gICAgPHVyaT5odHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzPC91cmk+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBFeGFtcGxlIGNvbXBvbmVudHMgbGlicmFyeS4gQWN0dWFsbHkgaXQgb25seSBjb250YWlucyBhIHNpbXBsZSBjb21wb25lbnQKLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLSBBZGQgeW91ciBjb21wb25lbnQgdGFncyBoZXJlIC0tPgotCi0gICAgPCEtLSBzYXlIZWxsbyBkZW1vIGNvbXBvbmVudC0tPgotICAgIDx0YWc+Ci0gICAgICAgIDxuYW1lPnNheUhlbGxvPC9uYW1lPgotICAgICAgICA8dGFnLWNsYXNzPm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG9UYWc8L3RhZy1jbGFzcz4KLSAgICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlNpbXBsZSBjb21wb25lbnQgdG8gZ3JlZXQgYSB1c2VyLjwvZGVzY3JpcHRpb24+Ci0KLSAgICAgICAgPCEtLSBpbXBvcnQgdGhlIGVudGl0aWVzIGZvciB0aGF0IGNvbXBvbmVudCBoZXJlLS0+Ci0gICAgICAgICZ1aV9jb21wb25lbnRfYXR0cmlidXRlczsKLSAgICAgICAgJnNheV9oZWxsb19hdHRyaWJ1dGVzOwotCTwvdGFnPgotCi0KLTwvdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlclRlc3QuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkOWM3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG87Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuYmFzZS5BYnN0cmFjdEpzZlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZXNwb25zZVdyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLS8qKgotICogQ2xhc3MgdG8gdGVzdCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBTYXlIZWxsbyByZW5kZXJlcgotICovCi1wdWJsaWMgY2xhc3MgU2F5SGVsbG9SZW5kZXJlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzZlRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyIDsKLSAgICBwcml2YXRlIFNheUhlbGxvIHNheUhlbGxvOwotCi0gICAgcHVibGljIFNheUhlbGxvUmVuZGVyZXJUZXN0KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKQotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICBzYXlIZWxsbyA9IG5ldyBTYXlIZWxsbygpOwotICAgICAgICBzYXlIZWxsby5zZXRGaXJzdE5hbWUoIkpvaG4iKTsKLSAgICAgICAgc2F5SGVsbG8uc2V0TGFzdE5hbWUoIlNtaXRoIik7Ci0KLSAgICAgICAgd3JpdGVyID0gbmV3IE1vY2tSZXNwb25zZVdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCksIG51bGwsIG51bGwpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsKLSAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhlc2UgdHdvIGxpbmVzIG9uY2Ugc2hhbGUtdGVzdCBnb2VzIGFscGhhLCBzZWUgTVlGQUNFUy0xMTU1Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKE1vY2tSZW5kZXJLaXRGYWN0b3J5LkhUTUxfQkFTSUNfUkVOREVSX0tJVCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRSZW5kZXJLaXQoKS5hZGRSZW5kZXJlcigKLSAgICAgICAgICAgICAgICBzYXlIZWxsby5nZXRGYW1pbHkoKSwKLSAgICAgICAgICAgICAgICBzYXlIZWxsby5nZXRSZW5kZXJlclR5cGUoKSwKLSAgICAgICAgICAgICAgICBuZXcgU2F5SGVsbG9SZW5kZXJlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBzYXlIZWxsbyA9IG51bGw7Ci0gICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUVuZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F5SGVsbG8uZW5jb2RlRW5kKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5yZW5kZXJSZXNwb25zZSgpOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXQgPSB3cml0ZXIuZ2V0V3JpdGVyKCkudG9TdHJpbmcoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIEpvaG4gU21pdGghIiwgb3V0cHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSgiQnllIEpvaG4gU21pdGghIiwgb3V0cHV0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlODcwYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSBUaGlzIGlzIHRoZSBwcm9qZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBleGFtcGxlcyBvZiBteSBjb21wb25lbnRzIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tZXhhbXBsZXM8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5NeSBDb21wb25lbnRzIEV4YW1wbGVzPC9uYW1lPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfS1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfS1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDwhLS0gUmVwb3NpdG9yeSBmb3IganN0bCAxLjIgLS0+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzE8L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4gCi0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDwhLS0gQnkgZGVmYXVsdCB0aGUgd2FyIGV4YW1wbGVzIHVzZSBteWZhY2VzISA6KSAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+bXlmYWNlczwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPiFqc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBTYW5kYm94IGV4YW1wbGVzIG11c3Qgb25seSBoYXZlIHJ1bnRpbWUgZGVwZW5kZW5jeSB0byBteWZhY2VzLWltcGwKLSAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gd2FyLiBCdXQgdGhlcmUgbXVzdCBub3QgYmUKLSAgICAgICAgICAgICAgICAgYW55IGNvbXBpbGUgZGVwZW5kZW5jeSBvbiBpbXBsIHNvIHRoYXQgaXMgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIHVzZQotICAgICAgICAgICAgICAgICBvdGhlciBKU0YgaW1wbGVtZW50YXRpb25zLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8anNmX2ltcGxlbWVudGF0aW9uPk15RmFjZXM8L2pzZl9pbXBsZW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDwhLS0gVG8gdXNlIHRoZSBleGFtcGxlcyB1c2luZyB0aGUgU3VuJ3MgSlNGIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbjogLURqc2Y9cmkgLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmpzZnJpPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xXzAyPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjFfMDI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPCEtLSAKLSAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgICAgICAgICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YS5uZXQgTWF2ZW4gMSBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHBzOi8vbWF2ZW4tcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQvbm9uYXYvcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8anNmX2ltcGxlbWVudGF0aW9uPkpTRi1SSTwvanNmX2ltcGxlbWVudGF0aW9uPgotICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvU2F5SGVsbG9CZWFuLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL1NheUhlbGxvQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjIxNTBjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvU2F5SGVsbG9CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuQWN0aW9uRXZlbnQ7Ci0KLS8qKgotICogTWFuYWdlZCBiZWFuIGZvciB0aGUgc2F5SGVsbG8gcGFnZSBleGFtcGxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXlIZWxsb0JlYW4KLXsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTYXlIZWxsb0JlYW4uY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiByZW5kZXJHcmVldGluZzsKLQotICAgIHB1YmxpYyBTYXlIZWxsb0JlYW4oKQotICAgIHsKLSAgICAgICAgdGhpcy5yZW5kZXJHcmVldGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNheUl0KEFjdGlvbkV2ZW50IGV2dCkKLSAgICB7Ci0gICAgICAgIHJlbmRlckdyZWV0aW5nID0gdHJ1ZTsKLQotICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmluZm8oIlRoZSBuYW1lIHRvIHNheSBoZWxsbyBpcyAnIitmaXJzdE5hbWUrIicgYW5kIHRoZSBsYXN0IG5hbWUgaXMgJyIrbGFzdE5hbWUrIicuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbmRlckdyZWV0aW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZW5kZXJHcmVldGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJHcmVldGluZyhib29sZWFuIHJlbmRlckdyZWV0aW5nKQotICAgIHsKLSAgICAgICAgdGhpcy5yZW5kZXJHcmVldGluZyA9IHJlbmRlckdyZWV0aW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9idWlsZC5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZGVhZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRG8gbm90IGVkaXQgdGhpcyBmaWxlLCBhcyBpdCB3aWxsIGJlIGNvbXBsZXRlZCBhdXRvbWF0aWNhbGx5Ci0jIGJ5IG1hdmVuIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcwotbXljb21wb25lbnRzX3ZlcnNpb249JHtwb20udmVyc2lvbn0KLWpzZl9pbXBsZW1lbnRhdGlvbj0ke2pzZl9pbXBsZW1lbnRhdGlvbn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZWM3NTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIj4KLQotPCEtLSA9PT09PT09PT09PSBGVUxMIENPTkZJR1VSQVRJT04gRklMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08IS0tIG15IGNvbXBvbmVudHMgZXhhbXBsZXMgLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0KLQotICAgIDwhLS0gTWFuYWdlZCBCZWFucyBmb3Igc2F5aGVsbG8uanNwIC0tPgotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5zYXlIZWxsb0JlYW48L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuZXhhbXBsZS5TYXlIZWxsb0JlYW48L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8IS0tIE5BVklHQVRJT04gUlVMRVMgLS0+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5nb19ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vaG9tZS5qc3A8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotCi0KLTwvZmFjZXMtY29uZmlnPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGEwMzhiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIiB2ZXJzaW9uPSIyLjQiPgotCi0gIDxkZXNjcmlwdGlvbj5kZWJ1ZyB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICA8Y29udGV4dC1wYXJhbT4KLSAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gIDwvY29udGV4dC1wYXJhbT4KLQotICA8Y29udGV4dC1wYXJhbT4KLSAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICA8cGFyYW0tdmFsdWU+c2VydmVyPC9wYXJhbS12YWx1ZT4KLSAgPC9jb250ZXh0LXBhcmFtPgotCi0gIDxzZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gIDwvc2VydmxldD4KLQotICA8c2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gIDwvc2VydmxldC1tYXBwaW5nPgotCi0gIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9ob21lLmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2hvbWUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2IwZTkwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2hvbWUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly93d3cubXlvcmdhbml0emF0aW9uLm9yZy9teWNvbXBvbmVudHMiIHByZWZpeD0ibXljb21wIiU+Ci0KLTxodG1sPgotCi08aGVhZD4KLSAgICA8dGl0bGU+TXkgSlNGIENvbXBvbmVudHMgRXhhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGY6dmlldz4KLSAgICA8aDpmb3JtPgotCi0gICAgICAgIDxmOmxvYWRCdW5kbGUgYmFzZW5hbWU9Im9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuZXhhbXBsZS5idWlsZCIgdmFyPSJidWlsZEluZm8iLz4KLQotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+Ci0gICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHN0eWxlPSJmb250LXdlaWdodDogYm9sZCIgdmFsdWU9Ik15IEpTRiBDb21wb25lbnRzIExpYnJhcnkiLz4KLSAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IiAoVmVyc2lvbiAje2J1aWxkSW5mb1snbXljb21wb25lbnRzX3ZlcnNpb24nXX0sIHVzaW5nICN7YnVpbGRJbmZvIFsnanNmX2ltcGxlbWVudGF0aW9uJ119KSIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotCi0gICAgICAgIDxoOnBhbmVsR3JpZD4KLQotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iTXkgY29tcG9uZW50IGV4YW1wbGVzIiAvPgotICAgICAgICAgICAgPGg6cGFuZWxHcmlkIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MjVweCI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGluayB2YWx1ZT0ic2F5aGVsbG8uanNmIj4KLSAgICAgICAgICAgICAgICAgICAgPGY6dmVyYmF0aW0+c2F5SGVsbG8gLSBkZW1vIGNvbXBvbmVudDwvZjp2ZXJiYXRpbT4KLSAgICAgICAgICAgICAgICA8L2g6b3V0cHV0TGluaz4KLSAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgIDwvaDpmb3JtPgotPC9mOnZpZXc+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTliNDguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGpzcDpmb3J3YXJkIHBhZ2U9ImhvbWUuanNmIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG8uanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG8uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTY3ZDcxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3NheWhlbGxvLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDx0aXRsZT5NeSBKU0YgQ29tcG9uZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08Zjp2aWV3PgotCi0gICAgPG15Y29tcDpzYXlIZWxsbyBmaXJzdE5hbWU9IkpvaG4iIGxhc3ROYW1lPSJTbWl0aCIvPgotCi0gICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iIChwcm9iYWJseSBub3QgeW91LCBJIGtub3cpIi8+Ci0KLSAgICA8Zjp2ZXJiYXRpbT48aHI+PC9mOnZlcmJhdGltPgotCi0gICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJpbnB1dEZpcnN0TmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUiIC8+Ci0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImlucHV0Rmlyc3ROYW1lIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4uZmlyc3ROYW1lfSIvPgotCi0gICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImlucHV0TGFzdE5hbWUiIHZhbHVlPSJMYXN0IG5hbWUiIC8+Ci0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImlucHV0TGFzdE5hbWUiIHZhbHVlPSIje3NheUhlbGxvQmVhbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+Ci0KLSAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlNheSBIZWxsbyEiIGFjdGlvbkxpc3RlbmVyPSIje3NheUhlbGxvQmVhbi5zYXlJdH0iLz4KLQotICAgICAgICAgICAgPG15Y29tcDpzYXlIZWxsbyBmaXJzdE5hbWU9IiN7c2F5SGVsbG9CZWFuLmZpcnN0TmFtZX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROYW1lPSIje3NheUhlbGxvQmVhbi5sYXN0TmFtZX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkPSIje3NheUhlbGxvQmVhbi5yZW5kZXJHcmVldGluZ30iLz4KLQotICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgdmFsdWU9IltIT01FXSIgYWN0aW9uPSJnb19ob21lIi8+Ci0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgIDwvaDpmb3JtPgotCi08L2Y6dmlldz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlMTljMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPG5hbWU+TXkgSlNGIENvbXBvbmVudHMgTGlicmFyeSBQcm9qZWN0PC9uYW1lPgotICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgaXMgdGhlIHByb2plY3QgZm9yIG15IGZ1bmt5IGNvbXBvbmVudHMuIFRoaXMgd2lsbCBidWlsZCBib3RoIHRoZSBjb3JlIGFuZCB0aGUgZXhhbXBsZXMKLSAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leGFtcGxlczwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPk15ZmFjZXMgcmVwb3NpdG9yeTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmcvZGlzdC9tYXZlbi1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNTI0OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL05PVElDRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJjMmI1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQ0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSANCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6DQotDQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uDQotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIA0KLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCINCi0NCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyANCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhZjUyMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+IAotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+TXlGYWNlcyBUcmluaWRhZCBBcmNoZXR5cGU8L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj5BcmNoZXR5cGUgdG8gY3JlYXRlIGEgbmV3IHdlYmFwcCBiYXNlZCBvbiBUcmluaWRhZDwvZGVzY3JpcHRpb24+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyYzJiNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0NCi09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzICAgICAgICAgICAgICAgICAgID09DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgDQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOg0KLQ0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+Lg0KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSANCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiDQotDQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgDQotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYXJjaGV0eXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhNTQzOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYXJjaGV0eXBlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotDQotPGFyY2hldHlwZT4NCi0gIDxpZD5teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDwvaWQ+DQotICA8cmVzb3VyY2VzPg0KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvYmxhbmsvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YTwvcmVzb3VyY2U+DQotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNweDwvcmVzb3VyY2U+DQotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNweDwvcmVzb3VyY2U+DQotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sPC9yZXNvdXJjZT4NCi0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWw8L3Jlc291cmNlPg0KLSAgPC9yZXNvdXJjZXM+DQotPC9hcmNoZXR5cGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzAzMDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+DQotICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPg0KLSAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0gIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+DQotICA8bmFtZT5BIGN1c3RvbSBwcm9qZWN0IHVzaW5nIG15ZmFjZXM8L25hbWU+DQotICA8dXJsPmh0dHA6Ly93d3cubXlvcmdhbml6YXRpb24ub3JnPC91cmw+DQotDQotICA8YnVpbGQ+DQotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+ICAgIA0KLSAgPC9idWlsZD4NCi0NCi0gIDxyZXBvc2l0b3JpZXM+DQotICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgIDxyZWxlYXNlcz4NCi0gICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4NCi0gICAgICA8L3NuYXBzaG90cz4NCi0gICAgICA8aWQ+YXBhY2hlLW1hdmVuLXNuYXBzaG90czwvaWQ+DQotICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pbmN1YmF0aW5nLXJlcG9zaXRvcnkvPC91cmw+DQotICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgPHJlcG9zaXRvcnk+DQotICAgICAgPGlkPmphdmEubmV0PC9pZD4NCi0gICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xPC91cmw+DQotICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4NCi0gICAgPC9yZXBvc2l0b3J5PiAgICANCi0gIDwvcmVwb3NpdG9yaWVzPg0KLQ0KLSAgPCEtLSBQcm9qZWN0IGRlcGVuZGVuY2llcyAtLT4NCi0gIDxkZXBlbmRlbmNpZXM+DQotICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgIDx2ZXJzaW9uPiR7bXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgPGRlcGVuZGVuY3k+DQotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgIDx2ZXJzaW9uPiR7bXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgPCEtLSBBcGFjaGUgVHJpbmlkYWQgLS0+DQotICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgPGRlcGVuZGVuY3k+DQotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPGRlcGVuZGVuY3k+DQotICAgIAk8Z3JvdXBJZD5qc3RsPC9ncm91cElkPg0KLSAgICAJPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgCTx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4NCi0gICAgCTxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4NCi0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4NCi0gICAgICA8dmVyc2lvbj40LjA8L3ZlcnNpb24+DQotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICA8L2RlcGVuZGVuY3k+DQotDQotICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gIDxwcm9wZXJ0aWVzPg0KLSAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuNTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPG15ZmFjZXMudmVyc2lvbj4xLjIuMjwvbXlmYWNlcy52ZXJzaW9uPg0KLSAgPC9wcm9wZXJ0aWVzPg0KLQ0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9ibGFuay9IZWxsb1dvcmxkQmFja2luZy5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvYmxhbmsvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwZWQ2ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9ibGFuay9IZWxsb1dvcmxkQmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuYmxhbms7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5yZW5kZXIuRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLlNlcnZpY2U7Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQmFja2luZwotewotCi0gIC8vcHJvcGVydGllcwotICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLQotICAvKioKLSAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEhlbGxvV29ybGRCYWNraW5nKCkKLSAgeyAgIAotICB9Ci0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tZ2V0dGVyICYgc2V0dGVyCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX25hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5fbmFtZSA9IG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICB7Ci0gICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICBFeHRlbmRlZFJlbmRlcktpdFNlcnZpY2Ugc2VydmljZSA9IChFeHRlbmRlZFJlbmRlcktpdFNlcnZpY2UpCi0gICAgICBTZXJ2aWNlLmdldFJlbmRlcktpdFNlcnZpY2UoZmFjZXNDb250ZXh0LCBFeHRlbmRlZFJlbmRlcktpdFNlcnZpY2UuY2xhc3MpOwotICAgIHNlcnZpY2UuYWRkU2NyaXB0KGZhY2VzQ29udGV4dCwgImFsZXJ0KCdTY3JpcHQgYWRkZWQgYnkgRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlJykiKTsKLQotICAgIC8vZG8gcmVhbCBsb2dpYwotICAgIHJldHVybiAoInN1Y2Nlc3MiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWVjYjY2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgDQotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIg0KLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4NCi0gIA0KLSAgPGFwcGxpY2F0aW9uPg0KLSAgICA8IS0tIFVzZSB0aGUgVHJpbmlkYWQgUmVuZGVyS2l0IC0tPg0KLSAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPg0KLSAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb3JlDQotICAgIDwvZGVmYXVsdC1yZW5kZXIta2l0LWlkPg0KLSAgPC9hcHBsaWNhdGlvbj4NCi0NCi0gIDwhLS0gR2xvYmFsIHByZWZlcmVuY2VzIG9iamVjdCB0aGF0IHByb3hpZXMgdG8gb3RoZXJzIC0tPg0KLSAgPG1hbmFnZWQtYmVhbj4NCi0gICAgPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGRCYWNraW5nPC9tYW5hZ2VkLWJlYW4tbmFtZT4NCi0gICAgPG1hbmFnZWQtYmVhbi1jbGFzcz4NCi0gICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmJsYW5rLkhlbGxvV29ybGRCYWNraW5nDQotICAgIDwvbWFuYWdlZC1iZWFuLWNsYXNzPg0KLSAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPg0KLSAgICAgICByZXF1ZXN0DQotICAgIDwvbWFuYWdlZC1iZWFuLXNjb3BlPg0KLSAgPC9tYW5hZ2VkLWJlYW4+DQotDQotICA8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGluZGV4LmpzcHggLS0+DQotICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICA8ZnJvbS12aWV3LWlkPi9pbmRleC5qc3B4PC9mcm9tLXZpZXctaWQ+DQotICAgIDxuYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+DQotICAgICAgPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcHg8L3RvLXZpZXctaWQ+DQotICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgPC9uYXZpZ2F0aW9uLXJ1bGU+DQotCQ0KLSAgPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3B4IC0tPg0KLSAgPG5hdmlnYXRpb24tcnVsZT4NCi0gICAgPGZyb20tdmlldy1pZD4vcGFnZTIuanNweDwvZnJvbS12aWV3LWlkPg0KLSAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgIDxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPg0KLSAgICAgIDx0by12aWV3LWlkPi9pbmRleC5qc3B4PC90by12aWV3LWlkPg0KLSAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gIDwvbmF2aWdhdGlvbi1ydWxlPg0KLQ0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2I0NTUyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ0lTTy04ODU5LTEnPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCINCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPg0KLSAgPCEtLSBVc2UgY2xpZW50LXNpZGUgc3RhdGUgc2F2aW5nLiAgSW4gVHJpbmlkYWQsIGl0IGlzIGFuDQotICAgICAgIG9wdGltaXplZCwgdG9rZW4tYmFzZWQgbWVjaGFuaXNtIHRoYXQgaXMgYWxtb3N0IGFsd2F5cyBhDQotICAgICAgIGJldHRlciBjaG9pY2UgdGhhbiB0aGUgc3RhbmRhcmQgSlNGIHNlcnZlci1zaWRlIHN0YXRlIHNhdmluZy4gLS0+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+DQotICAgIDwhLS1wYXJhbS12YWx1ZT5zZXJ2ZXI8L3BhcmFtLXZhbHVlLS0+DQotICA8L2NvbnRleHQtcGFyYW0+DQotDQotICA8IS0tIFRyaW5pZGFkIGJ5IGRlZmF1bHQgdXNlcyBhbiBvcHRpbWl6ZWQgY2xpZW50LXNpZGUgc3RhdGUgc2F2aW5nDQotICAgICAgIG1lY2hhbmlzbS4gVG8gZGlzYWJsZSB0aGF0LCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyAtLT4NCi0gIDwhLS1jb250ZXh0LXBhcmFtPg0KLSAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0xJRU5UX1NUQVRFX01FVEhPRDwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPmFsbDwvcGFyYW0tdmFsdWU+DQotICA8L2NvbnRleHQtcGFyYW0tLT4NCi0NCi0gIDwhLS0gVHJpbmlkYWQgYWxzbyBzdXBwb3J0cyBhbiBvcHRpbWl6ZWQgc3RyYXRlZ3kgZm9yIGNhY2hpbmcgc29tZQ0KLSAgIHZpZXcgc3RhdGUgYXQgYW4gYXBwbGljYXRpb24gbGV2ZWwsIHdoaWNoIHNpZ25pZmljYW50bHkgaW1wcm92ZXMNCi0gICBzY2FsYWJpbGl0eS4gIEhvd2V2ZXIsIGl0IG1ha2VzIGl0IGhhcmRlciB0byBkZXZlbG9wICh1cGRhdGVzIHRvDQotICAgcGFnZXMgd2lsbCBub3QgYmUgbm90aWNlZCB1bnRpbCB0aGUgc2VydmVyIGlzIHJlc3RhcnRlZCksIGFuZCBpbg0KLSAgIHNvbWUgcmFyZSBjYXNlcyBjYW5ub3QgYmUgdXNlZCBmb3Igc29tZSBwYWdlcyAoc2VlIFRyaW5pZGFkDQotICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbikgLS0+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPg0KLSAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPg0KLSAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgPCEtLSBJZiB0aGlzIHBhcmFtZXRlciBpcyBlbmFibGVkLCBUcmluaWRhZCB3aWxsIGF1dG9tYXRpY2FsbHkNCi0gICAgICAgY2hlY2sgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHlvdXIgSlNQcywgYW5kIGRpc2NhcmQgc2F2ZWQNCi0gICAgICAgc3RhdGUgd2hlbiB0aGV5IGNoYW5nZTsgIHRoaXMgbWFrZXMgZGV2ZWxvcG1lbnQgZWFzaWVyLA0KLSAgICAgICBidXQgYWRkcyBvdmVyaGVhZCB0aGF0IHNob3VsZCBiZSBhdm9pZGVkIHdoZW4geW91ciBhcHBsaWNhdGlvbg0KLSAgICAgICBpcyBkZXBsb3llZCAtLT4NCi0gIDxjb250ZXh0LXBhcmFtPg0KLSAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hFQ0tfRklMRV9NT0RJRklDQVRJT048L3BhcmFtLW5hbWU+DQotICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4NCi0gIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gIDwhLS0gRW5hYmxlcyBDaGFuZ2UgUGVyc2lzdGVuY2UgYXQgYSBzZXNzaW9uIHNjb3BlLiAgQnkgZGVmYXVsdCwNCi0gICAgICAgQ2hhbmdlIFBlcnNpc3RlbmNlIGlzIGVudGlyZWx5IGRpc2FibGVkLiBUaGUgQ2hhbmdlTWFuYWdlciBpcw0KLSAgICAgICBhbiBBUEksIHdoaWNoIGNhbiBwZXJzaXN0IGNvbXBvbmVudCBtb2RpZmljYXRpb25zIChsaWtlLA0KLSAgICAgICBpcyBhIHNob3dEZXRhaWwgb3IgdHJlZSBleHBhbmRlZCBvciBjb2xsYXBzZWQpLiBGb3IgcHJvdmlkaW5nDQotICAgICAgIGEgY3VzdG9tIENoYW5nZSBQZXJzaXN0ZW5jZSBpbXBsZW1lbnRhdGlvbiBpbmhlcml0IGZyb20gdGhlIA0KLSAgICAgICBUcmluaWRhZCBBUEkncyBDaGFuZ2VNYW5hZ2VyIGNsYXNzLiBBcyB0aGUgdmFsdWUgeW91IGhhdmUgDQotICAgICAgIHRvIHVzZSB0aGUgZnVsbHF1YWxpZmllZCBjbGFzcyBuYW1lLiAtLT4NCi0gIDxjb250ZXh0LXBhcmFtPg0KLSAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPg0KLSAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+DQotICA8L2NvbnRleHQtcGFyYW0+DQotDQotICA8ZmlsdGVyPg0KLSAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPg0KLSAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4NCi0gIDwvZmlsdGVyPg0KLQ0KLSAgPGZpbHRlci1tYXBwaW5nPg0KLSAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPg0KLSAgICA8c2VydmxldC1uYW1lPmZhY2VzPC9zZXJ2bGV0LW5hbWU+DQotICA8L2ZpbHRlci1tYXBwaW5nPg0KLQ0KLSAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPg0KLSAgPHNlcnZsZXQ+DQotICAgIDxzZXJ2bGV0LW5hbWU+ZmFjZXM8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4NCi0gIDwvc2VydmxldD4NCi0gIA0KLSAgPCEtLSByZXNvdXJjZSBsb2FkZXIgc2VydmxldCAtLT4NCi0gIDxzZXJ2bGV0Pg0KLSAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPg0KLSAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4NCi0gIDwvc2VydmxldD4NCi0NCi0gIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4NCi0gIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgIDxzZXJ2bGV0LW5hbWU+ZmFjZXM8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4NCi0gIDwvc2VydmxldC1tYXBwaW5nPg0KLSAgDQotICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPg0KLSAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4NCi0gIDwvc2VydmxldC1tYXBwaW5nPg0KLQ0KLQ0KLSAgPCEtLSBXZWxjb21lIEZpbGVzIC0tPg0KLSAgPHdlbGNvbWUtZmlsZS1saXN0Pg0KLSAgICA8d2VsY29tZS1maWxlPmZhY2VzL2luZGV4LmpzcHg8L3dlbGNvbWUtZmlsZT4NCi0gIDwvd2VsY29tZS1maWxlLWxpc3Q+DQotDQotPC93ZWItYXBwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3B4IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcHgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWM3ZWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcHgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIiBzdGFuZGFsb25lPSJ5ZXMiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMi4wIg0KLSAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIgPg0KLSAgPGpzcDpkaXJlY3RpdmUucGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiLz4NCi0gIDxmOnZpZXc+DQotICAgIDx0cjpkb2N1bWVudCB0aXRsZT0iQXBhY2hlIE15RmFjZXMgVHJpbmlkYWQgQXJjaGV0eXBlIERlbW8iPg0KLSAgICAgICA8dHI6Zm9ybT4NCi0gICAgICAgDQotICAgICAgICA8dHI6cGFuZWxQYWdlPg0KLSAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJZb3VyIG5hbWUiIGlkPSJpbnB1dDEiIHZhbHVlPSIje2hlbGxvV29ybGRCYWNraW5nLm5hbWV9IiByZXF1aXJlZD0idHJ1ZSIvPg0KLSAgICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiBpZD0iYnV0dG9uMSIgdGV4dD0icHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkQmFja2luZy5zZW5kfSIgLz4NCi0gICAgICAgIDwvdHI6cGFuZWxQYWdlPg0KLSAgICAgICANCi0gICAgICAgPC90cjpmb3JtPg0KLSAgICA8L3RyOmRvY3VtZW50Pg0KLSAgPC9mOnZpZXc+DQotPC9qc3A6cm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNweCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3B4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2NhZjQ0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3B4CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgc3RhbmRhbG9uZT0ieWVzIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxqc3A6cm9vdCB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiIHZlcnNpb249IjIuMCINCi0gICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiID4NCi0gIDxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Ii8+DQotICA8Zjp2aWV3Pg0KLSAgICA8dHI6ZG9jdW1lbnQgdGl0bGU9IkFwYWNoZSBNeUZhY2VzIFRyaW5pZGFkIEFyY2hldHlwZSBEZW1vIj4NCi0gICAgICAgPHRyOmZvcm0+DQotICAgICAgIA0KLSAgICAgICAgPHRyOnBhbmVsUGFnZT4NCi0gICAgICAgICAgPHRyOm91dHB1dFRleHQgaWQ9ImlucHV0MSIgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZEJhY2tpbmcubmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIFRyaW5pZGFkIi8+DQotICAgICAgICAgIDx0cjpjb21tYW5kTGluayBpZD0ibGluayIgdGV4dD0iR08gSE9NRSIgYWN0aW9uPSJiYWNrIiAvPg0KLSAgICAgICAgPC90cjpwYW5lbFBhZ2U+DQotICAgICAgIA0KLSAgICAgICA8L3RyOmZvcm0+DQotICAgIDwvdHI6ZG9jdW1lbnQ+DQotICA8L2Y6dmlldz4NCi08L2pzcDpyb290PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzU2YTM3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLSAgLSBUaGUgYXJjaGV0eXBlcyBwcm9qZWN0IGRlZmluZXMgYSBzZXQgb2YgbWF2ZW4gYXJjaGV0eXBlIHBsdWdpbnMgdGhhdCBjYW4gYmUKLSAgLSB1c2VkIHRvIGNyZWF0ZSBhbiBpbml0aWFsIGRpcmVjdG9yeSB0cmVlIG9mIGZpbGVzIHdoZW4gc3RhcnRpbmcgYSBuZXcgSlNGCi0gIC0gcHJvamVjdC4KLSAgLQotICAtIFRoaXMgcG9tIGlzIHVzZWQ6Ci0gIC0gKiBhcyB0aGUgcGFyZW50IHBvbSBmb3IgYWxsIGluZGl2aWR1YWwgYXJjaGV0eXBlIG1vZHVsZXMsIHRvIGRlZmluZSBjb21tb24gc2V0dGluZ3MKLSAgLSAqIHRvIGRlZmluZSB0aGUgY29tbW9uIGFyY2hldHlwZSB3ZWJzaXRlCi0gIC0gKiBhcyBhIGNvbnZlbmllbnQgdG9vbCBmb3IgYnVpbGRpbmcgYWxsIHRoZSBhcmNoZXR5cGUgcHJvamVjdHMuCi0gIC0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjU8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBBcmNoZXR5cGUgUGFyZW50PC9uYW1lPgotICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvYXJjaGV0eXBlczwvdXJsPgotCi0gIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTVlGQUNFUzwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8Y2lNYW5hZ2VtZW50PgotICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgPG5vdGlmaWVycz4KLSAgICAgIDxub3RpZmllcj4KLSAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvbm90aWZpZXI+Ci0gICAgPC9ub3RpZmllcnM+Ci0gIDwvY2lNYW5hZ2VtZW50PgotCi0gIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgPGJ1aWxkPgotICAgIDxyZXNvdXJjZXM+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3Jlc291cmNlPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotCi0gICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICA8cGx1Z2lucz4KLQk8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDwhLS0gMi40IHRocm93cyBlcnJvciwgc28gdGVtcG9yYWxseSBwdXQgb24gMi4zIC0tPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgPC9idWlsZD4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgotICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItYXJjaGV0eXBlcy88L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLWFyY2hldHlwZXMvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLWFyY2hldHlwZXMvPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0czwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0czwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQ8L21vZHVsZT4KLSAgICA8bW9kdWxlPm15ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHM8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotCi0gIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgPHNpdGU+Ci0gICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL2FyY2hldHlwZXM8L3VybD4KLSAgICA8L3NpdGU+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICA8cHJvZmlsZXM+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+cmVsZWFzZTwvaWQ+Ci0gICAgICA8IS0tCi0gICAgICBOT1RFOiBFeGVjdXRlIHRoaXMgcHJvZmlsZSBsaWtlCi0gICAgICAgICAgICBtdm4gY2xlYW4gc291cmNlOmphciBpbnN0YWxsIGRlcGxveSAtRGFsdERlcGxveW1lbnRSZXBvc2l0b3J5PW1hdHpldzo6ZGVmYXVsdDo6ZmlsZTovL0ZPTERFUiAtUHJlbGVhc2UKLSAgICAgICAtLT4KLSAgICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5zaWduLWFydGlmYWN0czwvaWQ+Ci0gICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KLSAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNjbS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8cGhhc2U+dmFsaWRhdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgIDxpZD5nZXR0aW5nLXNjbS5yZXZpc2lvbjwvaWQ+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+dXBkYXRlPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICA8L2J1aWxkPgotICAgIDwvcHJvZmlsZT4KLSAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9tYXZlbjItYXJjaGV0eXBlcy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkyM2E5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0gLS0tLS0tCi0gTXlmYWNlcyBBcmNoZXR5cGVzCi0gLS0tLS0tCi0KLU92ZXJ2aWV3Ci0KLSAgVGhlIGFyY2hldHlwZSBzdWJwcm9qZWN0cyBkZWZpbmUgTWF2ZW4gcGx1Z2lucyB0aGF0IGNhbiBidWlsZCBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcKLSAgdGhlIGZpbGVzIG5lZWRlZCB0byBxdWlja2x5IGdldCBzdGFydGVkIG9uIGEgbmV3IEpTRiBwcm9qZWN0LgotCi0gIERpZmZlcmVudCBhcmNoZXR5cGVzIGNyZWF0ZSBkaWZmZXJlbnQgaW5pdGlhbCBzZXR1cHMsIHN1Y2ggYXMgaW5jbHVkaW5nIGRpZmZlcmVudCBsaWJyYXJpZXMKLSAgaW4gdGhlIGNyZWF0ZWQgcG9tLnhtbCBmaWxlLCBhbmQgYWRkaW5nIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHRvIHRoZSBjcmVhdGVkIHdlYi54bWwgZmlsZS4KLQotQXJjaGV0eXBlcwotCi0qIEhlbGxvV29ybGQgQmFzaWMgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIHdlYmFwcCBwcm9qZWN0IHRoYXQgdXNlcyBNeUZhY2VzIENvcmUgMS4yLnggd2l0aCBKU1AgYXMgdGhlIHBhZ2UgdGVtcGxhdGluZyBzeXN0ZW0uCi0gIFRoZSB3ZWJhcHAgY29udGFpbnMgYSBzaW5nbGUgLmpzcCBmaWxlIGlzIGNyZWF0ZWQgd2hpY2ggcmVuZGVycyBhbiBIVE1MIHBhZ2Ugc2F5aW5nIAotICAiaGVsbG8gd29ybGQiLgotCi0qIEhlbGxvV29ybGQtRmFjZWxldHMgQXJjaGV0eXBlCi0KLSAgQXMgZm9yIHRoZSBIZWxsb1dvcmxkIGFyY2hldHlwZSwgYnV0IGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBGYWNlbGV0cyBwYWdlIHRlbXBsYXRpbmcgc3lzdGVtLgotCi0qIEhlbGxvV29ybGQtUG9ydGxldCBBcmNoZXR5cGUKLQotICBTZXRzIHVwIGEgc2ltcGxlIHBvcnRsZXQtZW5hYmxlZCB3ZWJhcHAuIAotCi0qIFRyaW5pZGFkIEFyY2hldHlwZQotCi0gIFNldHMgdXAgYSB3ZWJhcHAgdGhhdCB1c2VzIE15RmFjZXMgQ29yZSAxLjIueCBhbmQgTXlGYWNlcyBUcmluaWRhZC4KLQotKiBKU0YtQ29tcG9uZW50IExpYnJhcnkgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIHByb2plY3QgdGhhdCBpcyBpbnRlbmRlZCB0byBkZWZpbmUgbmV3IEpTRiBjb21wb25lbnRzIChyYXRoZXIgdGhhbiBqdXN0IHVzZSB0aGVtKS4KLSAgSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgamFyIHRoYXQgZGVmaW5lcyBhIHNldCBvZiBuZXcgY3VzdG9tIEpTRiBjb21wb25lbnRzIHRoZW4gdGhpcwotICBhcmNoZXR5cGUgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5NDZkMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdAotICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4gCi0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zPC9hcnRpZmFjdElkPiAKLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEJ1aWxkZXIgQW5ub3RhdGlvbnM8L25hbWU+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgIEEgc2V0IG9mIEphdmEgMS41IEFubm90YXRpb24gY2xhc3NlcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzZXMgdGhhdCBhcmUKLSAgICBpbnRlbmRlZCB0byBiZSBKU0YgY29tcG9uZW50cywgdmFsaWRhdG9ycywgZXRjLiBUaGUgbWF2ZW4tYnVpbGRlci1wbHVnaW4gd2lsbAotICAgIHJlY29nbmlzZSB0aGVzZSBhbm5vdGF0aW9ucyBhbmQgcHJvY2VzcyB0aGUgY2xhc3MgYXBwcm9wcmlhdGVseS4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NGY1MDguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+IAotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYnVpbGRlci1wbHVnaW48L2FydGlmYWN0SWQ+IAotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgQnVpbGRlciBQbHVnaW48L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBBIG1hdmVuIHBsdWdpbiB0aGF0IHVzZXMgYW5ub3RhdGlvbnMgKGphdmExNSBvciBkb2NsZXQgc3R5bGUpIHRvIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkgSlNGIGNvbmZpZ3VyYXRpb24KLSAgICBmaWxlcyAoLnRsZCwgZmFjZXMtY29uZmlnLnhtbCwgZXRjKSBhbmQgb3B0aW9uYWxseSBUYWcsIFZhbGlkYXRvciBhbmQgQ29tcG9uZW50IGNsYXNzZXMuCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPCEtLSByZXF1aXJlZCBmb3IgcGxleHVzLCBidXQgd2UgYXJlIG5vdCB1c2luZyB0aGlzIHJpZ2h0IG5vdwotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGdvYWxQcmVmaXg+bXlmYWNlcy1idWlsZGVyPC9nb2FsUHJlZml4PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgICAtLT4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNDwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS40PC90YXJnZXQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PiAgICAKLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4gICAKLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy5xZG94PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cWRveDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNi4zPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjg8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgCTxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPgotICAgIAk8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4KLSAgICAJPHZlcnNpb24+MS4wLmIyPC92ZXJzaW9uPgotICAgIAk8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zYXhvbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnNheG9uPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni41LjM8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuNi4yPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgIAk8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgIAk8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAJPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgCTwhLS0gPHNjb3BlPmNvbXBpbGU8L3Njb3BlPiAgLS0+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgCTxncm91cElkPnN0YXg8L2dyb3VwSWQ+Ci0gICAgCTxhcnRpZmFjdElkPnN0YXg8L2FydGlmYWN0SWQ+Ci0gICAgCTx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgotICAgIAk8IS0tIDxzY29wZT5ydW50aW1lPC9zY29wZT4gIC0tPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dmVsb2NpdHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD52ZWxvY2l0eTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tICAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdmVsb2NpdHk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjEuNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgIC0tPgotICAgIAotICAgIDwhLS0gUmVwb3J0aW5nIHJlcXVpcmVkIEFQSS0tPiAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5yZXBvcnRpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uZG94aWE8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5kb3hpYS1zaXRlLXJlbmRlcmVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTc8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRW5kIFJlcG9ydGluZyByZXF1aXJlZCBBUEkgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMTM8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjQxNjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0JICAgCi0tLT4KLTxwcm9qZWN0Ci0gIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPiAKLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXBsdWdpbi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLWZhY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4gCi0gIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBGYWNlcyBQbHVnaW48L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBBIG1hdmVuIHBsdWdpbiB0aGF0IHVzZXMgbWV0YWRhdGEgaW5wdXQgZmlsZXMgdG8gZ2VuZXJhdGUgSlNGIENvbXBvbmVudCwgVmFsaWRhdG9yIGFuZCBUYWcgY2xhc3NlcywKLSAgICB0b2dldGhlciB3aXRoIHRoZSBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24gZmlsZXMgKC50bGQsIGZhY2VzLWNvbmZpZy54bWwsIGV0YykuCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNDwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS40PC90YXJnZXQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPCEtLQotICAgICAgICAgIC0gT3ZlcnJpZGUgY2hlY2tzdHlsZSBjb25maWcgZmlsZSBkZWZpbml0aW9ucyBmcm9tIHBhcmVudCBwb20uIFRoZSBzb3VyY2Ugb2YKLSAgICAgICAgICAtIHRoaXMgcHJvamVjdCBpcyBub3QgY29tcGxpYW50IHdpdGggdGhlIG5vcm1hbCBNeUZhY2VzIGNvZGUgc3R5bGUgcnVsZXMsIGFuZAotICAgICAgICAgIC0gcHJvYmFibHkgbmV2ZXIgd2lsbCBiZS4KLSAgICAgICAgICAtLT4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1taW5pbWFsLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXItc3BhY2VzLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotCi0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjc8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c2F4b248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYXhvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuNS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjYuMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi4wX3JjMi1kZXY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0Fic3RyYWN0RmFjZXNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvQWJzdHJhY3RGYWNlc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkODQ4YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvQWJzdHJhY3RGYWNlc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuQWJzdHJhY3RPYmplY3RDcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLlJlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXNDb25maWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQXR0cmlidXRlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db252ZXJ0ZXJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXNDb25maWdQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5WYWxpZGF0b3JCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5BdHRyaWJ1dGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkNvbXBvbmVudEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29udmVydGVyRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5YSW5jbHVkZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVmFsaWRhdG9yRmlsdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdEZhY2VzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21waWxlRGVwZW5kZW5jeVJlc291cmNlcygKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICBTdHJpbmcgICAgICAgcmVzb3VyY2VQYXRoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIocHJvamVjdCk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gY2wuZ2V0UmVzb3VyY2VzKHJlc291cmNlUGF0aCk7Ci0gICAgICBMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICB1cmxzLmFkZCh1cmwpOwotICAgICAgfQotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodXJscyk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IHJlc291cmNlcyBmb3IgcGF0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyByZXNvdXJjZVBhdGggKyAiXCIiLCBlKTsKLSAgICB9Ci0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlUm9vdCgKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICBTdHJpbmcgICAgICAgcmVzb3VyY2VSb290KQotICB7Ci0gICAgTGlzdCByZXNvdXJjZXMgPSBwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKLSAgICByZXNvdXJjZS5zZXREaXJlY3RvcnkocmVzb3VyY2VSb290KTsKLSAgICByZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFVSTFtdIHJlYWRJbmRleCgKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICBTdHJpbmcgICAgICAgcmVzb3VyY2VQYXRoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRJbmRleChwcm9qZWN0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1hc3RlckNvbmZpZ3MoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAobG9jYWxSZXNvdXJjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHVybHMuYWRkKGxvY2FsUmVzb3VyY2UudG9VUkwoKSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICBnZXRMb2coKS5lcnJvcigiIiwgZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdXJsczsgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHJlc291cmNlUGF0aCA9ICJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZmFjZXMtY29uZmlnLnhtbCI7Ci0gICAgICByZXR1cm4gZ2V0Q29tcGlsZURlcGVuZGVuY3lSZXNvdXJjZXMocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgVVJMW10gcmVhZEluZGV4KAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gMS4gcmVhZCBtYXN0ZXIgZmFjZXMtY29uZmlnLnhtbCByZXNvdXJjZXMKLSAgICAgIExpc3QgbWFzdGVycyA9IGdldE1hc3RlckNvbmZpZ3MocHJvamVjdCk7Ci0gICAgICBpZiAobWFzdGVycy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIk1hc3RlciBmYWNlcy1jb25maWcueG1sIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gbmV3IFVSTFswXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlbnRyaWVzID0gbmV3IExpbmtlZExpc3QoKTsKLQotICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgc3BmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAvLyByZXF1aXJlcyBKQVhQIDEuMywgaW4gSmF2YVNFIDUuMAotICAgICAgICAvLyBzcGYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpPW1hc3RlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgVVJMIHVybCA9IChVUkwpaS5uZXh0KCk7Ci0gICAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoc3BmLm5ld1NBWFBhcnNlcigpKTsKLSAgICAgICAgICBkaWdlc3Rlci5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotICAgICAgICAgIC8vIFhJbmNsdWRlCi0gICAgICAgICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSShYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOwotICAgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9pbmNsdWRlIiwgImFkZCIsIDEpOwotICAgICAgICAgIGRpZ2VzdGVyLmFkZEZhY3RvcnlDcmVhdGUoImZhY2VzLWNvbmZpZy9pbmNsdWRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTENyZWF0aW9uRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsIDAsIDApOwotCi0gICAgICAgICAgZGlnZXN0ZXIucHVzaCh1cmwpOwotICAgICAgICAgIGRpZ2VzdGVyLnB1c2goZW50cmllcyk7Ci0gICAgICAgICAgZGlnZXN0ZXIucGFyc2UodXJsLm9wZW5TdHJlYW0oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFVSTFtdKWVudHJpZXMudG9BcnJheShuZXcgVVJMWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIG1hc3RlciBjb25maWciLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIG1hc3RlciBjb25maWciLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01vZGlmaWVkU2luY2UoCi0gICAgVVJMW10gdXJscywKLSAgICBsb25nICBsYXN0TW9kaWZpZWQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgdXJscy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmxzW2ldLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICBpZiAoY29ubi5nZXRMYXN0TW9kaWZpZWQoKSA+IGxhc3RNb2RpZmllZCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICogQGRlcHJlY2F0ZWQgY2FsbCBVdGlsLmNvbnZlcnRTdHJpbmdUb0xpdGVyYWwgaW5zdGVhZAotICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIFV0aWwuY29udmVydFN0cmluZ1RvTGl0ZXJhbCgiU3RyaW5nIiwgdmFsdWUpOwotICB9Ci0KLSAvKioKLSAgKiBAZGVwcmVjYXRlZCBjYWxsIFV0aWwuY29udmVydFN0cmluZ1RvTGl0ZXJhbCBpbnN0ZWFkCi0gICovCi0gIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFN0cmluZ1RvTGl0ZXJhbChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gVXRpbC5jb252ZXJ0U3RyaW5nVG9MaXRlcmFsKGNsYXNzTmFtZSwgdmFsdWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZWFkTGljZW5zZUhlYWRlcigpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAobGljZW5zZUhlYWRlckZpbGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gX0RFRkFVTFRfTElDRU5TRV9IRUFERVI7Ci0gICAgfQotICAgIAotICAgIGlmICghbGljZW5zZUhlYWRlckZpbGUuZXhpc3RzKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkxpY2Vuc2UgaGVhZGVyIGZpbGUgbm90IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbGljZW5zZUhlYWRlckZpbGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAobGljZW5zZUhlYWRlckZpbGUuaXNEaXJlY3RvcnkoKSkKLSAgICB7Ci0gICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkV4cGVjdGluZyBhIGZpbGUgYW5kIGZvdW5kIGEgZGlyZWN0b3J5OiAiCi0gICAgICAgICAgICAgICArbGljZW5zZUhlYWRlckZpbGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGxpY2Vuc2VIZWFkZXJGaWxlKSk7Ci0gICAgICBTdHJpbmcgbGluZTsKLSAgICAgIAotICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZChsaW5lKyJcbiIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXhjZXB0aW9uIHJlYWRpbmcgbGljZW5zZSBoZWFkZXIgZmlsZSIsIGUpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaWNlbnNlSGVhZGVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIGlmIChfbGljZW5zZUhlYWRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIF9saWNlbnNlSGVhZGVyID0gcmVhZExpY2Vuc2VIZWFkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIF9saWNlbnNlSGVhZGVyOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBjbGFzcyBVUkxDcmVhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeQotICB7Ci0gICAgcHVibGljIE9iamVjdCBjcmVhdGVPYmplY3QoCi0gICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICB7Ci0gICAgICBTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImhyZWYiKTsKLSAgICAgIGlmIChocmVmID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1pc3NpbmcgaHJlZiBhdHRyaWJ1dGUiKTsKLQotICAgICAgVVJMIG1hc3RlciA9IChVUkwpZGlnZXN0ZXIuZ2V0Um9vdCgpOwotICAgICAgcmV0dXJuIG5ldyBVUkwobWFzdGVyLCBocmVmKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5kZXgoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QsCi0gICAgU3RyaW5nICAgICAgIHJlc291cmNlUGF0aCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIF9mYWNlc0NvbmZpZyA9IG5ldyBGYWNlc0NvbmZpZ0JlYW4oKTsKLQotICAgIFVSTFtdIGluZGV4ID0gcmVhZEluZGV4KHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgaW5kZXgubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcHJvY2Vzc0luZGV4RW50cnkoaW5kZXhbaV0pOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleEVudHJ5KAotICAgIFVSTCBlbnRyeSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIFVSTCBvbGQgPSBfZmFjZXNDb25maWcuc2V0Q3VycmVudFJlc291cmNlKGVudHJ5KTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBuZXcgRmFjZXNDb25maWdQYXJzZXIoKS5tZXJnZShfZmFjZXNDb25maWcsIGVudHJ5KTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIF9mYWNlc0NvbmZpZy5zZXRDdXJyZW50UmVzb3VyY2Uob2xkKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRmFjZXNDb25maWdCZWFuIGdldEZhY2VzQ29uZmlnKCkKLSAgewotICAgIHJldHVybiBfZmFjZXNDb25maWc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByZWFtYmxlKAotICAgIFByZXR0eVdyaXRlciBvdXQpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQud3JpdGUoX0FVVE9fR0VORVJBVEVfV0FSTklORyk7Ci0gICAgb3V0LndyaXRlKGdldExpY2Vuc2VIZWFkZXIoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjb3B5RmlsZSgKLSAgICBGaWxlICAgc291cmNlRGlyZWN0b3J5LAotICAgIFN0cmluZyBzb3VyY2VQYXRoLAotICAgIEZpbGUgICB0YXJnZXREaXJlY3RvcnkpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLQotICAgICAgaWYgKHNvdXJjZUZpbGUuZXhpc3RzKCkgJiYKLSAgICAgICAgICBzb3VyY2VGaWxlLmxhc3RNb2RpZmllZCgpID4gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGdldExvZygpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkNvcHlpbmcgZmlsZSBcIiIgKyBzb3VyY2VQYXRoICsgIlwiIik7Ci0KLSAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKHNvdXJjZUZpbGUsIHRhcmdldEZpbGUpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY29weWluZyBmaWxlIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VQYXRoICsgIlwiIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAvKioKLSAgKiBAZGVwcmVjYXRlZCB1c2UgVXRpbC53cml0ZUltcG9ydHMgaW5zdGVhZAotICAqLwotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUltcG9ydHMoCi0gICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICBTdHJpbmcgICAgICAgcGFja2FnZU5hbWUsCi0gICAgU2V0ICAgICAgICAgIGltcG9ydHMpCi0gIHsKLSAgICBHZW5lcmF0b3JIZWxwZXIud3JpdGVJbXBvcnRzKG91dCxwYWNrYWdlTmFtZSxpbXBvcnRzKTsKLSAgfQotCi0gIHByaXZhdGUgQ2xhc3NMb2FkZXIgY3JlYXRlQ29tcGlsZUNsYXNzTG9hZGVyKAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgIENsYXNzTG9hZGVyIGNsID0gY3VycmVudC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIExpc3QgY2xhc3NwYXRoRWxlbWVudHMgPSBwcm9qZWN0LmdldENvbXBpbGVDbGFzc3BhdGhFbGVtZW50cygpOwotICAgICAgaWYgKCFjbGFzc3BhdGhFbGVtZW50cy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSAoU3RyaW5nW10pY2xhc3NwYXRoRWxlbWVudHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbZW50cmllcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsc1tpXSA9IG5ldyBGaWxlKGVudHJpZXNbaV0pLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscywgY2wpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjYWxjdWxhdGluZyBzY29wZSBjbGFzc3BhdGgiLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjYWxjdWxhdGluZyBzY29wZSBjbGFzc3BhdGgiLCBlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2w7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgU2tpcEZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0gICAgICAvLyBza2lwIEFQSSBhbmQgYmFzZSBjbGFzcyBnZW5lcmF0aW9uPwotICAgICAgcmV0dXJuICFza2lwQXBpT3JCYXNlQ2xhc3NlcyB8fCAoIWNvbXBvbmVudFR5cGUuc3RhcnRzV2l0aCgiamF2YXgiKSAmJgotICAgICAgICAgICAgICAgICFjb21wb25lbnRUeXBlLmVuZHNXaXRoKCJCYXNlIikpOwotCi0gICAgfQotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb21wb25lbnRUeXBlRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29tcG9uZW50VHlwZUZpbHRlcigKLSAgICAgIFN0cmluZyB0eXBlUHJlZml4KQotICAgIHsKLSAgICAgIF90eXBlUHJlZml4ID0gdHlwZVByZWZpeDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7ICAgICAgICAKLSAgICAgIHJldHVybiAoY29tcG9uZW50VHlwZS5zdGFydHNXaXRoKF90eXBlUHJlZml4KSk7Ci0gICAgfQotICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfdHlwZVByZWZpeDsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29tcG9uZW50Q2xhc3NGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBDb21wb25lbnRDbGFzc0ZpbHRlcigKLSAgICAgIFN0cmluZyBwYWNrYWdlQ29udGFpbnMpCi0gICAgewotICAgICAgX3BhY2thZ2VDb250YWlucyA9IHBhY2thZ2VDb250YWluczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKTsKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoY29tcG9uZW50Q2xhc3MpOwotCi0gICAgICAvLyBhY2NlcHQgb25seSBjbGFzc2VzIHRoYXQgbWF0Y2ggdGhlIHBhY2thZ2UKLSAgICAgIHJldHVybiAocGFja2FnZU5hbWUuY29udGFpbnMoX3BhY2thZ2VDb250YWlucykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wYWNrYWdlQ29udGFpbnM7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudFRhZ0NsYXNzRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29tcG9uZW50VGFnQ2xhc3NGaWx0ZXIoCi0gICAgICBTdHJpbmcgcGFja2FnZUNvbnRhaW5zKQotICAgIHsKLSAgICAgIF9wYWNrYWdlQ29udGFpbnMgPSBwYWNrYWdlQ29udGFpbnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gY29tcG9uZW50LmdldFRhZ0NsYXNzKCk7Ci0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKHRhZ0NsYXNzKTsKLQotICAgICAgLy8gYWNjZXB0IG9ubHkgY2xhc3NlcyBpbiB0aGlzIHByb2plY3QncyAoc3ViKXBhY2thZ2UKLSAgICAgIHJldHVybiAocGFja2FnZU5hbWUuY29udGFpbnMoX3BhY2thZ2VDb250YWlucykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wYWNrYWdlQ29udGFpbnM7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbnZlcnRlclRhZ0NsYXNzRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29udmVydGVyVGFnQ2xhc3NGaWx0ZXIoCi0gICAgICBTdHJpbmcgcGFja2FnZUNvbnRhaW5zKQotICAgIHsKLSAgICAgIF9wYWNrYWdlQ29udGFpbnMgPSBwYWNrYWdlQ29udGFpbnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpCi0gICAgewotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gY29udmVydGVyLmdldFRhZ0NsYXNzKCk7Ci0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKHRhZ0NsYXNzKTsKLQotICAgICAgLy8gYWNjZXB0IG9ubHkgY2xhc3NlcyB0aGF0IGNvbnRhaW4gdGhlIGRlc2lyZWQgc3RyaW5nCi0gICAgICByZXR1cm4gKHBhY2thZ2VOYW1lLmNvbnRhaW5zKF9wYWNrYWdlQ29udGFpbnMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcGFja2FnZUNvbnRhaW5zOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBWYWxpZGF0b3JUYWdDbGFzc0ZpbHRlciBleHRlbmRzIFZhbGlkYXRvckZpbHRlcgotICB7Ci0gICAgcHVibGljIFZhbGlkYXRvclRhZ0NsYXNzRmlsdGVyKAotICAgICAgU3RyaW5nIHBhY2thZ2VDb250YWlucykKLSAgICB7Ci0gICAgICBfcGFja2FnZUNvbnRhaW5zID0gcGFja2FnZUNvbnRhaW5zOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKQotICAgIHsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IHZhbGlkYXRvci5nZXRUYWdDbGFzcygpOwotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyh0YWdDbGFzcyk7Ci0KLSAgICAgIC8vIGFjY2VwdCBvbmx5IGNsYXNzZXMgdGhhdCBjb250YWluIHRoZSBkZXNpcmVkIHN0cmluZwotICAgICAgcmV0dXJuIChwYWNrYWdlTmFtZS5jb250YWlucyhfcGFja2FnZUNvbnRhaW5zKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BhY2thZ2VDb250YWluczsKLSAgfQotCi0gIAotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29tcG9uZW50VGFnRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGNvbXBvbmVudC5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29udmVydGVyVGFnRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gKGNvbnZlcnRlci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yVGFnRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICByZXR1cm4gKHZhbGlkYXRvci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29tcG9uZW50VGFnTGlicmFyeUZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHVibGljIENvbXBvbmVudFRhZ0xpYnJhcnlGaWx0ZXIoCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgIHsKLSAgICAgIHRoaXMobmFtZXNwYWNlVVJJLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcG9uZW50VGFnTGlicmFyeUZpbHRlcigKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICBib29sZWFuIHJlcXVpcmVUYWdDbGFzcykKLSAgICB7Ci0gICAgICBfbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgICAgX3JlcXVpcmVUYWdDbGFzcyA9IHJlcXVpcmVUYWdDbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBRTmFtZSB0YWdOYW1lID0gY29tcG9uZW50LmdldFRhZ05hbWUoKTsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IGNvbXBvbmVudC5nZXRUYWdDbGFzcygpOwotCi0gICAgICAvLyBhY2NlcHQgaWYgdGFnQ2xhc3MgaXMgcHJlc2VudAotICAgICAgLy8gYW5kIGlmIHRhZ05hbWUgaXMgaW4gdGhlIGRlc2lyZWQgbmFtZXNwYWNlVVJJCi0gICAgICByZXR1cm4gKCghX3JlcXVpcmVUYWdDbGFzcyB8fCAodGFnQ2xhc3MgIT0gbnVsbCkpICYmCi0gICAgICAgICAgICAgIHRhZ05hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICBfbmFtZXNwYWNlVVJJLmVxdWFscyh0YWdOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX25hbWVzcGFjZVVSSTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX3JlcXVpcmVUYWdDbGFzczsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yVGFnTGlicmFyeUZpbHRlciBleHRlbmRzIFZhbGlkYXRvckZpbHRlcgotICB7Ci0gICAgcHVibGljIFZhbGlkYXRvclRhZ0xpYnJhcnlGaWx0ZXIoCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgIHsKLSAgICAgIHRoaXMobmFtZXNwYWNlVVJJLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsaWRhdG9yVGFnTGlicmFyeUZpbHRlcigKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICBib29sZWFuIHJlcXVpcmVUYWdDbGFzcykKLSAgICB7Ci0gICAgICBfbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgICAgX3JlcXVpcmVUYWdDbGFzcyA9IHJlcXVpcmVUYWdDbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICBRTmFtZSB0YWdOYW1lID0gdmFsaWRhdG9yLmdldFRhZ05hbWUoKTsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IHZhbGlkYXRvci5nZXRUYWdDbGFzcygpOwotCi0gICAgICAvLyBhY2NlcHQgaWYgdGFnQ2xhc3MgaXMgcHJlc2VudAotICAgICAgLy8gYW5kIGlmIHRhZ05hbWUgaXMgaW4gdGhlIGRlc2lyZWQgbmFtZXNwYWNlVVJJCi0gICAgICByZXR1cm4gKCghX3JlcXVpcmVUYWdDbGFzcyB8fCAodGFnQ2xhc3MgIT0gbnVsbCkpICYmCi0gICAgICAgICAgICAgIHRhZ05hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICBfbmFtZXNwYWNlVVJJLmVxdWFscyh0YWdOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX25hbWVzcGFjZVVSSTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX3JlcXVpcmVUYWdDbGFzczsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29udmVydGVyVGFnTGlicmFyeUZpbHRlciBleHRlbmRzIENvbnZlcnRlckZpbHRlcgotICB7Ci0gICAgcHVibGljIENvbnZlcnRlclRhZ0xpYnJhcnlGaWx0ZXIoCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgIHsKLSAgICAgIHRoaXMobmFtZXNwYWNlVVJJLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udmVydGVyVGFnTGlicmFyeUZpbHRlcigKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICBib29sZWFuIHJlcXVpcmVUYWdDbGFzcykKLSAgICB7Ci0gICAgICBfbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgICAgX3JlcXVpcmVUYWdDbGFzcyA9IHJlcXVpcmVUYWdDbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICBRTmFtZSB0YWdOYW1lID0gY29udmVydGVyLmdldFRhZ05hbWUoKTsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IGNvbnZlcnRlci5nZXRUYWdDbGFzcygpOwotCi0gICAgICAvLyBhY2NlcHQgaWYgdGFnQ2xhc3MgaXMgcHJlc2VudAotICAgICAgLy8gYW5kIGlmIHRhZ05hbWUgaXMgaW4gdGhlIGRlc2lyZWQgbmFtZXNwYWNlVVJJCi0gICAgICByZXR1cm4gKCghX3JlcXVpcmVUYWdDbGFzcyB8fCAodGFnQ2xhc3MgIT0gbnVsbCkpICYmCi0gICAgICAgICAgICAgIHRhZ05hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICBfbmFtZXNwYWNlVVJJLmVxdWFscyh0YWdOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX25hbWVzcGFjZVVSSTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX3JlcXVpcmVUYWdDbGFzczsKLSAgfQotCi0gIHN0YXRpYyBwcm90ZWN0ZWQgY2xhc3MgVmlydHVhbEF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIEF0dHJpYnV0ZUZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQXR0cmlidXRlQmVhbiBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgcmV0dXJuICFhdHRyaWJ1dGUuaXNWaXJ0dWFsKCk7Ci0gICAgfQotICB9Ci0KLSAvKioKLSAgKiBAcGFyYW1ldGVyCi0gICovCi0gIHByaXZhdGUgRmlsZSBsaWNlbnNlSGVhZGVyRmlsZTsKLQotICAvKioKLSAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWUgPSAidHJ1ZSIKLSAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHNraXBBcGlPckJhc2VDbGFzc2VzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIEZpbGUgbG9jYWxSZXNvdXJjZTsKLQotCi0KLSAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gX2ZhY2VzQ29uZmlnOwotICBwcml2YXRlIFN0cmluZyBfbGljZW5zZUhlYWRlcjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0FVVE9fR0VORVJBVEVfV0FSTklORyA9Ci0iLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksXG4iKwotIi8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLlxuXG4iOwotCi0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9ERUZBVUxUX0xJQ0VOU0VfSEVBREVSID0KLSAgICAiLypcbiIgKwotICAgICIgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4iICsKLSAgICAiICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4iICsKLSAgICAiICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiIgKwotICAgICIgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4iICsKLSAgICAiICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuIiArCi0gICAgIiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuIiArCi0gICAgIiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiIgKwotICAgICIgKlxuIiArCi0gICAgIiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4iICsKLSAgICAiICpcbiIgKwotICAgICIgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4iICsKLSAgICAiICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiIgKwotICAgICIgKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuIiArCi0gICAgIiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuIiArCi0gICAgIiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiIgKwotICAgICIgKiB1bmRlciB0aGUgTGljZW5zZS5cbiIgKwotICAgICIqL1xuIjsKLX0KLSAgCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVDb21wb25lbnRzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlQ29tcG9uZW50c01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjZWYyMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVDb21wb25lbnRzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5jb21wb25lbnQuQ29tcG9uZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLmNvbXBvbmVudC5NeUZhY2VzQ29tcG9uZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLmNvbXBvbmVudC5UcmluaWRhZENvbXBvbmVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5GYWNlc0NvbmZpZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkNvbXBvbmVudEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuU291cmNlVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIGdlbmVyYXRlLWNvbXBvbmVudHMKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUNvbXBvbmVudHNNb2pvIGV4dGVuZHMgQWJzdHJhY3RGYWNlc01vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHByb2Nlc3NJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgICAgX2dlbmVyYXRlQ29tcG9uZW50cygpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb21wb25lbnRzIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBwYXJzZWQgY29tcG9uZW50cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfZ2VuZXJhdGVDb21wb25lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBNYWtlIHN1cmUgZ2VuZXJhdGVkIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAvLyBpcyBhZGRlZCB0byBjb21waWxhdGlvbiBzb3VyY2UgcGF0aAotICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgIGlmICghZmFjZXNDb25maWcuaGFzQ29tcG9uZW50cygpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBubyBjb21wb25lbnRzIGZvdW5kIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3VwcHJlc3NMaXN0ZW5lck1ldGhvZHMpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIkV2ZW50IGxpc3RlbmVyIG1ldGhvZHMgd2lsbCBub3QgYmUgZ2VuZXJhdGVkIik7Ci0gICAgICB9Ci0KLSAgICAgIEl0ZXJhdG9yIGNvbXBvbmVudHMgPSBmYWNlc0NvbmZpZy5jb21wb25lbnRzKCk7Ci0gICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IFNraXBGaWx0ZXIoKSk7Ci0gICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50VHlwZUZpbHRlcih0eXBlUHJlZml4KSk7Ci0KLSAgICAgIC8vIGluY3JlbWVudGFsIHVubGVzcyBmb3JjZWQKLSAgICAgIGlmICghZm9yY2UpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgSWZNb2RpZmllZEZpbHRlcigpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIGFsbCBjb21wb25lbnRzIGFyZSB1cCB0byBkYXRlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCk7Ci0gICAgICAgICAgaWYgKCFjb21wb25lbnQuaXNDb21wb25lbnRDbGFzc0V4Y2x1ZGVkKCkpewotICAgICAgICAgICAgICBfZ2VuZXJhdGVDb21wb25lbnQoY29tcG9uZW50KTsKLSAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgY291bnQgKyAiIGNvbXBvbmVudChzKSIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgYSBwYXJzZWQgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50ICB0aGUgcGFyc2VkIGNvbXBvbmVudCBtZXRhZGF0YQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZUNvbXBvbmVudCgKLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIENvbXBvbmVudEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgICBTdHJpbmcgZnVsbENsYXNzTmFtZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpOwotCi0gICAgaWYgKGNvbXBvbmVudC5pc1RyaW5pZGFkQ29tcG9uZW50KCkpCi0gICAgewotICAgICAgZ2VuZXJhdG9yID0gbmV3IFRyaW5pZGFkQ29tcG9uZW50R2VuZXJhdG9yKGdldExvZygpLCBfaXMxMigpKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBnZW5lcmF0b3IgPSBuZXcgTXlGYWNlc0NvbXBvbmVudEdlbmVyYXRvcihnZXRMb2coKSxfaXMxMigpICk7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpbmcgIiArIGZ1bGxDbGFzc05hbWUrIiwgd2l0aCBnZW5lcmF0b3I6ICIrZ2VuZXJhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aChmdWxsQ2xhc3NOYW1lLCAiLmphdmEiKTsKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0KLSAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgIFByZXR0eVdyaXRlciBvdXQgPSBuZXcgUHJldHR5V3JpdGVyKHN3KTsKLQotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZ1bGxDbGFzc05hbWUpOwotICAgICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSA9IGNvbXBvbmVudC5maW5kQ29tcG9uZW50RmFtaWx5KCk7Ci0KLSAgICAgIGlmIChjb21wb25lbnRGYW1pbHkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkud2FybigiTWlzc2luZyA8Y29tcG9uZW50LWZhbWlseT4gZm9yIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bGxDbGFzc05hbWUgKyAiXCIsIGdlbmVyYXRpb24gb2YgdGhpcyBDb21wb25lbnQgaXMgc2tpcHBlZCIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGZ1bGxDbGFzc05hbWUpOwotICAgICAgICBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lID0gY29tcG9uZW50LmZpbmRDb21wb25lbnRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZ1bGxTdXBlcmNsYXNzTmFtZSk7Ci0KLSAgICAgICAgLy8gbWFrZSBjbGFzcyBuYW1lIGZ1bGx5IHF1YWxpZmllZCBpbiBjYXNlIG9mIGNvbGxpc2lvbgotICAgICAgICBpZiAoc3VwZXJjbGFzc05hbWUuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICAgICAgc3VwZXJjbGFzc05hbWUgPSBmdWxsU3VwZXJjbGFzc05hbWU7Ci0KLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgYm9nb3NpdHkKLSAgICAgICAgaWYgKHN1cGVyY2xhc3NOYW1lLmVxdWFscygiVUlYTWVudUhpZXJhcmNoeSIpIHx8Ci0gICAgICAgICAgICBzdXBlcmNsYXNzTmFtZS5lcXVhbHMoIlVJWFRhYmxlIikgfHwKLSAgICAgICAgICAgIHN1cGVyY2xhc3NOYW1lLmVxdWFscygiVUlYSGllcmFyY2h5IikgfHwKLSAgICAgICAgICAgIHN1cGVyY2xhc3NOYW1lLmVxdWFscygiVUlYTWVudVRyZWUiKSB8fAotICAgICAgICAgICAgY2xhc3NOYW1lLmVxdWFscygiQ29yZVRyZWUiKSkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyY2xhc3NOYW1lID0gZnVsbFN1cGVyY2xhc3NOYW1lOwotICAgICAgICB9Ci0KLQotICAgICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgICAgLy8gVXNlIHRlbXBsYXRlIGZpbGUgaWYgaXQgZXhpc3RzCi0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aChmdWxsQ2xhc3NOYW1lLCAiVGVtcGxhdGUuamF2YSIpOwotICAgICAgICBGaWxlIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCB0ZW1wbGF0ZVBhdGgpOwotCi0gICAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLSAgICAgICAgaWYgKHRlbXBsYXRlRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIGdldExvZygpLmRlYnVnKCJVc2luZyB0ZW1wbGF0ZSAiICsgdGVtcGxhdGVQYXRoKTsKLSAgICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBTb3VyY2VUZW1wbGF0ZSh0ZW1wbGF0ZUZpbGUpOwotICAgICAgICAgIHRlbXBsYXRlLnN1YnN0aXR1dGUoY2xhc3NOYW1lICsgIlRlbXBsYXRlIiwgY2xhc3NOYW1lKTsKLSAgICAgICAgICB0ZW1wbGF0ZS5yZWFkUHJlZmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGVhZGVyL2NvcHlyaWdodAotICAgICAgICB3cml0ZVByZWFtYmxlKG91dCk7Ci0KLSAgICAgICAgLy8gcGFja2FnZQotICAgICAgICBvdXQucHJpbnRsbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiOyIpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotCi0gICAgICAgIC8vIGltcG9ydHMKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlSW1wb3J0cyhvdXQsIHRlbXBsYXRlLCBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBmdWxsU3VwZXJjbGFzc05hbWUsIHN1cGVyY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCk7Ci0KLSAgICAgICAgLy8gY2xhc3MKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlQ2xhc3NCZWdpbihvdXQsIGNsYXNzTmFtZSwgc3VwZXJjbGFzc05hbWUsIGNvbXBvbmVudCwgdGVtcGxhdGUpOwotCi0gICAgICAgIC8vIHN0YXRpYyBmaW5hbCBjb25zdGFudHMKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlUHJvcGVydHlWYWx1ZUNvbnN0YW50cyhvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIGdlbmVyYXRvci53cml0ZVByb3BlcnR5Q29uc3RhbnRzKG91dCwgc3VwZXJjbGFzc05hbWUsIGNvbXBvbmVudCk7Ci0gICAgICAgIGdlbmVyYXRvci53cml0ZUZhY2V0Q29uc3RhbnRzKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlR2VuZXJpY0NvbnN0YW50cyhvdXQsIGNvbXBvbmVudEZhbWlseSwgY29tcG9uZW50VHlwZSk7Ci0KLSAgICAgICAgLy8gcHVibGljIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVDb25zdHJ1Y3RvcihvdXQsIGNvbXBvbmVudCwgTW9kaWZpZXIuUFVCTElDKTsKLQotICAgICAgICAvLyBpbnNlcnQgdGVtcGxhdGUgY29kZQotICAgICAgICBpZiAodGVtcGxhdGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRlbXBsYXRlLndyaXRlQ29udGVudChvdXQpOwotICAgICAgICAgIHRlbXBsYXRlLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZW5lcmF0b3Iud3JpdGVGYWNldE1ldGhvZHMob3V0LCBjb21wb25lbnQpOwotCi0gICAgICAgIGlmICh0ZW1wbGF0ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLndyaXRlUHJvcGVydHlNZXRob2RzKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZW5lcmF0b3Iud3JpdGVQcm9wZXJ0eU1ldGhvZHMob3V0LCBjb21wb25lbnQsIHRlbXBsYXRlLmdldElnbm9yZU1ldGhvZHMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghc3VwcHJlc3NMaXN0ZW5lck1ldGhvZHMpCi0gICAgICAgIHsKLSAgICAgICAgICBnZW5lcmF0b3Iud3JpdGVMaXN0ZW5lck1ldGhvZHMob3V0LCBjb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlU3RhdGVNYW5hZ2VtZW50TWV0aG9kcyhvdXQsIGNvbXBvbmVudCk7Ci0KLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlR2V0RmFtaWx5KG91dCk7Ci0KLSAgICAgICAgLy8gcHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcwotICAgICAgICAvLyBUT0RPOiByZXZlcnNlIHRoaXMgb3JkZXIsIHRvIG1ha2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGdvIGZpcnN0Ci0gICAgICAgIC8vICAgICAgIGZvciBub3cgd2Ugd2FudCBjb25zaXN0ZW5jeSB3aXRoIHByZXZpb3VzIGNvZGUgZ2VuZXJhdGlvbgotICAgICAgICBnZW5lcmF0b3Iud3JpdGVPdGhlcihvdXQsIGNvbXBvbmVudCk7Ci0KLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlQ2xhc3NFbmQob3V0KTsKLQotICAgICAgICBvdXQuY2xvc2UoKTsKLQotICAgICAgICAvLyBkZWxheSB3cml0ZSBpbiBjYXNlIG9mIGVycm9yCi0gICAgICAgIC8vIHRpbWVzdGFtcCBzaG91bGQgbm90IGJlIHVwZGF0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgICAgLy8gZGVsZXRlIHRhcmdldCBmaWxlIGZpcnN0LCBiZWNhdXNlIGl0IGlzIHJlYWRvbmx5Ci0gICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIodGFyZ2V0RmlsZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBzdy5nZXRCdWZmZXIoKTsKLSAgICAgICAgZncud3JpdGUoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICBmdy5jbG9zZSgpOwotICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGdldExvZygpLmVycm9yKCJFcnJvciBnZW5lcmF0aW5nICIgKyBmdWxsQ2xhc3NOYW1lLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIElmTW9kaWZpZWRGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpOwotICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aChjb21wb25lbnRDbGFzcywgIi5qYXZhIik7Ci0gICAgICBTdHJpbmcgdGVtcGxhdGVQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgoY29tcG9uZW50Q2xhc3MsICJUZW1wbGF0ZS5qYXZhIik7Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotICAgICAgRmlsZSB0ZW1wbGF0ZUZpbGUgPSBuZXcgRmlsZSh0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSwgdGVtcGxhdGVQYXRoKTsKLQotICAgICAgLy8gYWNjZXB0IGlmIHRlbXBsYXRlRmlsZSBpcyBuZXdlciBvciBjb21wb25lbnQgaGFzIGJlZW4gbW9kaWZpZWQKLSAgICAgIHJldHVybiAodGVtcGxhdGVGaWxlLmxhc3RNb2RpZmllZCgpID4gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSB8fAotICAgICAgICAgICAgICBjb21wb25lbnQuaXNNb2RpZmllZFNpbmNlKHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX2lzMTIoKQotICB7Ci0gICAgcmV0dXJuICIxLjIiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMTIiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgfQotICAKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZVBhdGggPSAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2luZGV4LmxzdCI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YS10ZW1wbGF0ZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWZhY2VzLXBsdWdpbi9tYWluL2phdmEiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VDb250YWluczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZVByZWZpeDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NMaXN0ZW5lck1ldGhvZHM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGpzZlZlcnNpb247Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlbGV0c1RhZ2xpYnNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlbGV0c1RhZ2xpYnNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzE0NmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZWxldHNUYWdsaWJzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbnZlcnRlckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5GYWNlc0NvbmZpZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5WYWxpZGF0b3JCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5YSW5jbHVkZUZpbHRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIGdlbmVyYXRlLWZhY2VsZXRzLXRhZ2xpYnMKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUZhY2VsZXRzVGFnbGlic01vam8gZXh0ZW5kcyBBYnN0cmFjdEZhY2VzTW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gYWx3YXlzIGFkZCByZXNvdXJjZXMgZGlyZWN0b3J5IHRvIHByb2plY3QgcmVzb3VyY2Ugcm9vdAotICAgICAgYWRkUmVzb3VyY2VSb290KHByb2plY3QsIGdlbmVyYXRlZFJlc291cmNlc0RpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgICBwcm9jZXNzSW5kZXgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLQotICAgICAgLy8gdGFnbGlicyBtYXAgc3ludGF4IHJlcXVpcmVzIGRpc3RpbmN0IHNob3J0TmFtZXMsCi0gICAgICAvLyB3aGljaCBpcyBhIEdvb2QgVGhpbmchCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHNob3J0TmFtZSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgRmFjZXNDb25maWdCZWFuIGZhY2VzQ29uZmlnID0gZ2V0RmFjZXNDb25maWcoKTsKLSAgICAgICAgSXRlcmF0b3IgY29tcG9uZW50cyA9IGZhY2VzQ29uZmlnLmNvbXBvbmVudHMoKTsKLSAgICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBTa2lwRmlsdGVyKCkpOwotICAgICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudFRhZ0xpYnJhcnlGaWx0ZXIobmFtZXNwYWNlVVJJLCBmYWxzZSkpOwotCi0gICAgICAgIEl0ZXJhdG9yIHZhbGlkYXRvcnMgPSBmYWNlc0NvbmZpZy52YWxpZGF0b3JzKCk7Ci0gICAgICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yVGFnTGlicmFyeUZpbHRlcihuYW1lc3BhY2VVUkksIGZhbHNlKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgY29udmVydGVycyA9IGZhY2VzQ29uZmlnLmNvbnZlcnRlcnMoKTsKLSAgICAgICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJUYWdMaWJyYXJ5RmlsdGVyKG5hbWVzcGFjZVVSSSwgZmFsc2UpKTsKLQotCi0gICAgICAgIFN0cmluZyB0YXJnZXRQYXRoID0gIk1FVEEtSU5GLyIgKyBzaG9ydE5hbWUgKyAiLnRhZ2xpYi54bWwiOwotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRSZXNvdXJjZXNEaXJlY3RvcnksIHRhcmdldFBhdGgpOwotCi0gICAgICAgIFN0cmluZyBjb25maWdQYXRoID0gIk1FVEEtSU5GLyIgKyBzaG9ydE5hbWUgKyAiLWJhc2UudGFnbGliLnhtbCI7Ci0gICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGNvbmZpZ1NvdXJjZURpcmVjdG9yeSwgY29uZmlnUGF0aCk7Ci0KLSAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLQotICAgICAgICBpZiAoKGNvbXBvbmVudHMuaGFzTmV4dCgpfHx2YWxpZGF0b3JzLmhhc05leHQoKXx8Y29udmVydGVycy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAmJiBjb25maWdGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCk7Ci0KLSAgICAgICAgICBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoc3RyZWFtLCBfWElOQ0xVREVfRkFDRUxFVFNfVEFHX0xJQlJBUllfRFREKTsKLSAgICAgICAgICAvLyBiYXNlIGdvZXMgZmlyc3QKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInhpIiwgImluY2x1ZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOwotICAgICAgICAgIHN0cmVhbS53cml0ZU5hbWVzcGFjZSgieGkiLCBYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUF0dHJpYnV0ZSgiaHJlZiIsIGNvbmZpZ0ZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVBdHRyaWJ1dGUoInhwb2ludGVyIiwgIi9mYWNlbGV0LXRhZ2xpYi8qIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgIF93cml0ZVRhZ3MoY29tcG9uZW50cywgdmFsaWRhdG9ycywgY29udmVydGVycywgc3RyZWFtKTsKLQotICAgICAgICAgIF93cml0ZUVuZFRhZ0xpYnJhcnkoc3RyZWFtKTsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgIElucHV0U3RyZWFtIG1lcmdlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAvLyBleHBhbmQgYWxsIHRoZSB4aTppbmNsdWRlIGVsZW1lbnRzCi0gICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIHNheEZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgc2F4RmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4RmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICBYTUxSZWFkZXIgbWVyZ2VkUmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICAgIG1lcmdlZFJlYWRlciA9IG5ldyBYSW5jbHVkZUZpbHRlcihtZXJnZWRSZWFkZXIsIGNvbmZpZ0ZpbGUudG9VUkwoKSk7Ci0gICAgICAgICAgLy8gZXZlbiB3aXRoIHZhbGlkYXRpbmc9ZmFsc2UsIERURCBpcyBzdGlsbCBkb3dubG9hZGVkIHNvIHRoYXQKLSAgICAgICAgICAvLyBhbnkgZW50aXRpZXMgY29udGFpbmVkIGluIHRoZSBkb2N1bWVudCBjYW4gYmUgZXhwYW5kZWQuCi0gICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBkaXNhYmxlcyB0aGF0IGJlaGF2aW9yLCBhbHNvIHNhdmluZyB0aGUgdGltZQotICAgICAgICAgIC8vIHNwZW50IHRvIHBhcnNlIHRoZSBEVEQKLSAgICAgICAgICBtZXJnZWRSZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkLAotICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgIElucHV0U291cmNlIG1lcmdlZElucHV0ID0gbmV3IElucHV0U291cmNlKG1lcmdlZFN0cmVhbSk7Ci0gICAgICAgICAgU291cmNlIG1lcmdlZFNvdXJjZSA9IG5ldyBTQVhTb3VyY2UobWVyZ2VkUmVhZGVyLCBtZXJnZWRJbnB1dCk7Ci0KLSAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgIFJlc3VsdCBtZXJnZWRSZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHRhcmdldEZpbGUpOwotCi0gICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFRyYW5zZm9ybWVyIGlkZW50aXR5ID0gdHJhbnNGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgaWRlbnRpdHkuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1BVQkxJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMpOwotICAgICAgICAgIGlkZW50aXR5LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNKTsKLSAgICAgICAgICBpZGVudGl0eS50cmFuc2Zvcm0obWVyZ2VkU291cmNlLCBtZXJnZWRSZXN1bHQpOwotCi0gICAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudHMuaGFzTmV4dCgpfHx2YWxpZGF0b3JzLmhhc05leHQoKXx8Y29udmVydGVycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgWE1MT3V0cHV0RmFjdG9yeSBvdXRwdXRGYWN0b3J5ID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0gPSBvdXRwdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQpOwotCi0gICAgICAgICAgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KHN0cmVhbSwgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RURCk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgibmFtZXNwYWNlIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhuYW1lc3BhY2VVUkkpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICAgIF93cml0ZVRhZ3MoY29tcG9uZW50cywgdmFsaWRhdG9ycywgY29udmVydGVycywgc3RyZWFtKTsKLSAgICAgICAgICBfd3JpdGVFbmRUYWdMaWJyYXJ5KHN0cmVhbSk7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29uZmlnRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGNvcHkgaWYgbmV3ZXIKLSAgICAgICAgICBpZiAoY29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGNvbmZpZ0ZpbGUsIHRhcmdldEZpbGUpOwotICAgICAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgdGFyZ2V0UGF0aCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVRhZ3MoSXRlcmF0b3IgY29tcG9uZW50cywgSXRlcmF0b3IgdmFsaWRhdG9ycywKLSAgICAgICAgICBJdGVyYXRvciBjb252ZXJ0ZXJzLCBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtKQotICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgd2hpbGUgKGNvbXBvbmVudHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCk7Ci0gICAgICBfd3JpdGVUYWcoc3RyZWFtLCBjb21wb25lbnQpOwotICAgIH0KLSAgICB3aGlsZSAodmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgX3dyaXRlVmFsaWRhdG9yVGFnKHN0cmVhbSwgKFZhbGlkYXRvckJlYW4pIHZhbGlkYXRvcnMubmV4dCgpKTsKLSAgICB9Ci0gICAgd2hpbGUgKGNvbnZlcnRlcnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIF93cml0ZUNvbnZlcnRlclRhZyhzdHJlYW0sIChDb252ZXJ0ZXJCZWFuKSBjb252ZXJ0ZXJzLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVN0YXJ0VGFnTGlicmFyeSgKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIFN0cmluZyAgICAgICAgICBkdGQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZVN0YXJ0RG9jdW1lbnQoIjEuMCIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgc3RyZWFtLndyaXRlRFREKGR0ZCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImZhY2VsZXQtdGFnbGliIik7Ci0gICAgc3RyZWFtLndyaXRlRGVmYXVsdE5hbWVzcGFjZShfRkFDRUxFVFNfTkFNRVNQQUNFX1VSSSk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUVuZFRhZ0xpYnJhcnkoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVFbmREb2N1bWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVRhZygKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIENvbXBvbmVudEJlYW4gICBjb21wb25lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnLW5hbWUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImNvbXBvbmVudCIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJjb21wb25lbnQtdHlwZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIAotICAgIGlmIChjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJyZW5kZXJlci10eXBlIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyB0YWdIYW5kbGVyID0gY29tcG9uZW50LmdldFRhZ0hhbmRsZXIoKTsKLSAgICBpZiAodGFnSGFuZGxlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHRhZ0hhbmRsZXIgPSBmYWNlbGV0SGFuZGxlckNsYXNzOwotICAgIH0KLSAgICBpZiAodGFnSGFuZGxlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImhhbmRsZXItY2xhc3MiKTsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnModGFnSGFuZGxlcik7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yIHBhcnNlZCB2YWxpZGF0b3IgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3dyaXRlVmFsaWRhdG9yVGFnKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgVmFsaWRhdG9yQmVhbiAgIHZhbGlkYXRvcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWctbmFtZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnModmFsaWRhdG9yLmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidmFsaWRhdG9yIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInZhbGlkYXRvci1pZCIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnModmFsaWRhdG9yLmdldFZhbGlkYXRvcklkKCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciBwYXJzZWQgY29udmVydGVyIG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbnZlcnRlclRhZygKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIENvbnZlcnRlckJlYW4gICBjb252ZXJ0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnLW5hbWUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbnZlcnRlci5nZXRUYWdOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImNvbnZlcnRlciIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJjb252ZXJ0ZXItaWQiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJJZCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZmFjZXMtY29uZmlnLnhtbCIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VQYXRoOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBNYXAgdGFnbGliczsKLQotCi0gIC8qKgotICAgKkBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGZhY2VsZXRIYW5kbGVyQ2xhc3M7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vY29uZiIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgY29uZmlnU291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWZhY2VzLXBsdWdpbi9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgZ2VuZXJhdGVkUmVzb3VyY2VzRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9GQUNFTEVUU19OQU1FU1BBQ0VfVVJJID0KLSAgICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0ZhY2VsZXQiOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMgPQotICAgICAgICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0gPQotICAgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9GQUNFTEVUU19UQUdfTElCUkFSWV9EVEQgPQotICAgICI8IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDIFxuIiArCi0gICAgIiAgXCIiICsgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDICsgIlwiXG4iICsKLSAgICAiICBcIiIgKyBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0gKyAiXCIgPlxuIjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX1hJTkNMVURFX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RURCA9Ci0gICAgIjwhRE9DVFlQRSB0YWdsaWIgUFVCTElDXG4iICsKLSAgICAiICBcIiIgKyBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMgKyAiXCJcbiIgKwotICAgICIgIFwiIiArIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSArICJcIiBbXG4iICsKLSAgICAiICAgICAgPCFFTEVNRU5UIHhpOmluY2x1ZGUgRU1QVFk+XG4iICsKLSAgICAiICAgICAgPCFBVFRMSVNUIHhpOmluY2x1ZGVcbiIgKwotICAgICIgICAgICAgICAgeG1sbnM6eGkgQ0RBVEEgI0ZJWEVEICBcIiIgKyBYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UgKyAiXCJcbiIgKwotICAgICIgICAgICAgICAgaHJlZiAgICAgQ0RBVEEgI0lNUExJRURcbiIgKwotICAgICIgICAgICAgICAgeHBvaW50ZXIgQ0RBVEEgI0lNUExJRUQ+XG4iICsKLSAgICAiXT5cbiI7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlc0NvbmZpZ01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VzQ29uZmlnTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjIyNDIwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VzQ29uZmlnTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuWEluY2x1ZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIGdlbmVyYXRlLWZhY2VzLWNvbmZpZwotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVGYWNlc0NvbmZpZ01vam8gZXh0ZW5kcyBBYnN0cmFjdEZhY2VzTW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gYWx3YXlzIGFkZCByZXNvdXJjZXMgZGlyZWN0b3J5IHRvIHByb2plY3QgcmVzb3VyY2Ugcm9vdAotICAgICAgYWRkUmVzb3VyY2VSb290KHByb2plY3QsIHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHRhcmdldFBhdGgpOwotCi0gICAgICBVUkxbXSBpbmRleCA9IHJlYWRJbmRleChwcm9qZWN0KTsKLQotICAgICAgaWYgKCFmb3JjZSAmJiAhaXNNb2RpZmllZFNpbmNlKGluZGV4LCB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtICIgKyB0YXJnZXRQYXRoICsgIiBpcyB1cCB0byBkYXRlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgY29uZmlnVVJMcyA9IGdldE1hc3RlckNvbmZpZ3MocHJvamVjdCk7Ci0KLSAgICAgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoY29uZmlnRGlyZWN0b3J5LCBjb25maWdQYXRoKTsKLSAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25maWdVUkxzID0gbmV3IExpbmtlZExpc3QoY29uZmlnVVJMcyk7Ci0gICAgICAgICAgLy8gYmFzZSBjb25maWcgZ29lcyBmaXJzdAotICAgICAgICAgIGNvbmZpZ1VSTHMuYWRkKDAsIGNvbmZpZ0ZpbGUudG9VUkwoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWNvbmZpZ1VSTHMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgVVJMIGJhc2VVUkwgPSBHZW5lcmF0ZUZhY2VzQ29uZmlnTW9qby5jbGFzcy5nZXRSZXNvdXJjZSgicmVzb3VyY2VzL2ZhY2VzLWNvbmZpZy54bWwiKTsKLSAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY0ZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkb2NGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jQnVpbGRlci5wYXJzZShiYXNlVVJMLm9wZW5TdHJlYW0oKSk7Ci0gICAgICAgICAgRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAvLyBlbWJlZCBlYWNoIDx4aTppbmNsdWRlPiBlbGVtZW50Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29uZmlnVVJMcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKWkubmV4dCgpOwotICAgICAgICAgICAgRWxlbWVudCBpbmNsdWRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGk6aW5jbHVkZSIpOwotICAgICAgICAgICAgaW5jbHVkZS5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICBpbmNsdWRlLnNldEF0dHJpYnV0ZSgieHBvaW50ZXIiLCAiL2ZhY2VzLWNvbmZpZy8qIik7Ci0gICAgICAgICAgICByb290Lmluc2VydEJlZm9yZShpbmNsdWRlLCByb290LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gTm90ZTogdXNlIGEgZGlyZWN0IERPTS0+U0FYIHJlYWRlcgotICAgICAgICAgIC8vICAgICAgIHJhdGhlciB0aGFuIHRyYW5zZm9ybWluZyB0byBzdHJpbmcKLSAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgVHJhbnNmb3JtZXIgaWRlbnRpdHkgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgIGlkZW50aXR5LnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChvdXQpKTsKLQotICAgICAgICAgIElucHV0U3RyZWFtIG1lcmdlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgLy8gZXhwYW5kIGFsbCB0aGUgeGk6aW5jbHVkZSBlbGVtZW50cwotICAgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4RmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBzYXhGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgIHNheEZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IHNheEZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgWE1MUmVhZGVyIG1lcmdlZFJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgICBtZXJnZWRSZWFkZXIgPSBuZXcgWEluY2x1ZGVGaWx0ZXIobWVyZ2VkUmVhZGVyLCBiYXNlVVJMKTsKLSAgICAgICAgICBtZXJnZWRSZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkLAotICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgIElucHV0U291cmNlIG1lcmdlZElucHV0ID0gbmV3IElucHV0U291cmNlKG1lcmdlZFN0cmVhbSk7Ci0gICAgICAgICAgU291cmNlIG1lcmdlZFNvdXJjZSA9IG5ldyBTQVhTb3VyY2UobWVyZ2VkUmVhZGVyLCBtZXJnZWRJbnB1dCk7Ci0KLSAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGNvbWJpbmVkIGZhY2VzLWNvbmZpZy54bWwgZmlsZSB0byByZXNvbHZlCi0gICAgICAgICAgLy8gY29tcG9uZW50LXN1cGVydHlwZSwgaW5qZWN0IHRoZSBEVEQgYW5kIGVuc3VyZSB0aGF0Ci0gICAgICAgICAgLy8gbWV0YWRhdGEgaXMgcmVwcmVzZW50ZWQgY29tcGF0aWJseSB3aXRoIEpTRiAxLjEgc3ludGF4LgotICAgICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0KLSAgICAgICAgICBGaWxlIHRtcEZpbGUgPSBudWxsOwotICAgICAgICAgIE91dHB1dFN0cmVhbSByZXN1bHRTdHJlYW07Ci0gICAgICAgICAgaWYgKHRyYW5zZm9ybVN0eWxlc2hlZXQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZ2VuZXJhdGUtZmFjZXMtY29uZmlnIiwgbnVsbCk7Ci0gICAgICAgICAgICByZXN1bHRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFJlc3VsdCBtZXJnZWRSZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHJlc3VsdFN0cmVhbSk7Ci0KLSAgICAgICAgICBVUkwgeHNsVVJMOwotICAgICAgICAgIGlmIChfaXMxMigpKQotICAgICAgICAgICAgeHNsVVJMID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgicmVzb3VyY2VzL3RyYW5zZm9ybTEyLnhzbCIpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHhzbFVSTCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoInJlc291cmNlcy90cmFuc2Zvcm0ueHNsIik7Ci0KLSAgICAgICAgICBJbnB1dFN0cmVhbSB4c2wgPSB4c2xVUkwub3BlblN0cmVhbSgpOwotICAgICAgICAgIFN0cmVhbVNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbCk7Ci0gICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLSAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInBhY2thZ2VDb250YWlucyIsIHBhY2thZ2VDb250YWlucyk7Ci0gICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJ0eXBlUHJlZml4IiwgdHlwZVByZWZpeCk7Ci0gICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJyZW1vdmVSZW5kZXJlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW5kZXJlcnMgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoImNvbnZlcnRlclBhY2thZ2VDb250YWlucyIsIGdldFBhcmFtZXRlcihjb252ZXJ0ZXJQYWNrYWdlQ29udGFpbnMsIHBhY2thZ2VDb250YWlucykpOwotICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigidmFsaWRhdG9yUGFja2FnZUNvbnRhaW5zIiwgZ2V0UGFyYW1ldGVyKHZhbGlkYXRvclBhY2thZ2VDb250YWlucywgcGFja2FnZUNvbnRhaW5zKSk7Ci0KLSAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obWVyZ2VkU291cmNlLCBtZXJnZWRSZXN1bHQpOwotICAgICAgICAgIHJlc3VsdFN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgLy8gT0ssIGlmIHRoZXJlJ3MgYSB0cmFuc2Zvcm1TeWxlc2hlZXQsIHdlJ3ZlIHdyaXR0ZW4KLSAgICAgICAgICAvLyB0aGUgb3V0cHV0IHRvIGEgdGVtcG9yYXJ5IGZpbGUsIG5vdyB0cmFuc2Zvcm0gaXQgYWdhaW4uCi0gICAgICAgICAgLy8gPS09RklYTUUgQWRhbVdpbmVyOiAgbm8sIHRoaXMgaXMgbm90IHRoZSBzbWFydGVzdCBhbmQKLSAgICAgICAgICAvLyBmYXN0ZXN0IHdheSB0byBkbyBpdC4gIEJ1dCBhZnRlciBmaW5kaW5nIG91dAotICAgICAgICAgIC8vIHRoYXQgWE1MRmlsdGVyIGFwcGFyZW50bHkgZG9lc24ndCBzdXBwb3J0IFhTTCBwYXJhbWV0ZXJzLAotICAgICAgICAgIC8vIGFuZCBydW5uaW5nIGludG8gYSBiaXphcnJlICJpbGxlZ2FsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246Ci0gICAgICAgICAgLy8gc2F4b246d2FybmluZyIgZXJyb3IgbWVzc2FnZSB3aGVuIHVzaW5nIGNoYWluZWQgaGFuZGxlcnMsIEkgZ290Ci0gICAgICAgICAgLy8gdGlyZWQgb2YgdHJ5aW5nIHRvIGJlIHNtYXJ0LiAgVGhpcyBpcyBnb29kIGVub3VnaC4KLSAgICAgICAgICBpZiAodHJhbnNmb3JtU3R5bGVzaGVldCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmVhbVNvdXJjZSB0bXBTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHRtcEZpbGUpOwotICAgICAgICAgICAgU3RyZWFtU291cmNlIHRyYW5zZm9ybVNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUoY29uZmlnRGlyZWN0b3J5LCB0cmFuc2Zvcm1TdHlsZXNoZWV0KSk7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lciBmaW5hbFRyYW5zZm9ybSA9Ci0gICAgICAgICAgICAgIHRyYW5zRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih0cmFuc2Zvcm1Tb3VyY2UpOwotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaW5hbE91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgICAgUmVzdWx0IGZpbmFsUmVzdWx0ID0KLSAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChmaW5hbE91dCk7Ci0KLSAgICAgICAgICAgIGZpbmFsVHJhbnNmb3JtLnRyYW5zZm9ybSh0bXBTb3VyY2UsIGZpbmFsUmVzdWx0KTsKLSAgICAgICAgICAgIGZpbmFsT3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIAotICAgICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLQotICAgICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgdGFyZ2V0UGF0aCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9pczEyKCkKLSAgewotICAgIHJldHVybiAiMS4yIi5lcXVhbHMoanNmVmVyc2lvbikgfHwgIjEyIi5lcXVhbHMoanNmVmVyc2lvbik7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtTmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKLSAgewotICAgIFN0cmluZyBwYXJhbTsKLQotICAgIGlmIChwYXJhbU5hbWUubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgICBwYXJhbSA9IHBhcmFtTmFtZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcGFyYW0gPSBkZWZhdWx0VmFsdWU7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9jb25mIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBjb25maWdEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGNvbmZpZ1BhdGggPSAiTUVUQS1JTkYvZmFjZXMtY29uZmlnLWJhc2UueG1sIjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUNvbnRhaW5zID0gIiI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRlclBhY2thZ2VDb250YWlucyA9ICIiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JQYWNrYWdlQ29udGFpbnMgPSAiIjsKLQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWZhY2VzLXBsdWdpbi9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0YXJnZXRQYXRoID0gIk1FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHR5cGVQcmVmaXggPSAiIjsKLQotICAvKioKLSAgICogTmFtZSBvZiBhbiBYU0xUIHN0eWxlc2hlZXQgaW4gc3JjL21haW4vY29uZiB0aGF0IHdpbGwgYmUgYXBwbGllZAotICAgKiBhcyB0aGUgZmluYWwgc3RlcC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGFueSBmaW5hbCBmaXh1cAotICAgKiBvZiB0aGUgb3V0cHV0LgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0cmFuc2Zvcm1TdHlsZXNoZWV0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlUmVuZGVyZXJzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBqc2ZWZXJzaW9uOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlSnNwVGFnbGlic01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUpzcFRhZ2xpYnNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTRiODIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlSnNwVGFnbGlic01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5BYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLkNvbXBvbmVudFRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuTXlGYWNlc0NvbXBvbmVudFRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuTXlGYWNlc0NvbnZlcnRlclRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuTXlGYWNlc1ZhbGlkYXRvclRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuVGFnQXR0cmlidXRlRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5UcmluaWRhZENvbXBvbmVudFRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuVHJpbmlkYWRDb252ZXJ0ZXJUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLlRyaW5pZGFkVmFsaWRhdG9yVGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbnZlcnRlckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5GYWNlc0NvbmZpZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5NZXRob2RTaWduYXR1cmVCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG9uZW50RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db252ZXJ0ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlZhbGlkYXRvckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuWEluY2x1ZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgZ2VuZXJhdGUtanNwLXRhZ2xpYnMKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUpzcFRhZ2xpYnNNb2pvIGV4dGVuZHMgQWJzdHJhY3RGYWNlc01vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHByb2Nlc3NJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgICAgX2dlbmVyYXRlVGFnSGFuZGxlcnMoKTsKLSAgICAgIF9nZW5lcmF0ZVRhZ0xpYnJhcnlEZXNjcmlwdG9ycygpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb21wb25lbnRzIiwgZSk7Ci0gICAgfQotICB9Ci0KLQotICAvLyBob29rIGZvciBjdXN0b20gY29tcG9uZW50IHRhZyBqYXZhIGNvbnRlbnQKLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDdXN0b21Db21wb25lbnRUYWdIYW5kbGVyQ29udGVudCgKLSAgICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvLyBob29rIGZvciBjdXN0b20gY29tcG9uZW50IHRhZyBqYXZhIGltcG9ydHMKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ3VzdG9tQ29tcG9uZW50VGFnSGFuZGxlckltcG9ydHMoCi0gICAgICBTZXQgICAgICAgICAgIGltcG9ydHMsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICB9Ci0KLSAgLy8gaG9vayBmb3IgY3VzdG9tIGNvbXBvbmVudCBkZXNjcmlwdG9yIGNvbnRlbnQKLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDdXN0b21Db21wb25lbnRUYWdEZXNjcmlwdG9yQ29udGVudCgKLSAgICAgIFhNTFN0cmVhbVdyaXRlciAgc3RyZWFtLAotICAgICAgQ29tcG9uZW50QmVhbiAgICBjb21wb25lbnQpdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgZm9yIHBhcnNlZCBjb21wb25lbnQgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX2dlbmVyYXRlVGFnTGlicmFyeURlc2NyaXB0b3JzKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGFsd2F5cyBhZGQgcmVzb3VyY2VzIGRpcmVjdG9yeSB0byBwcm9qZWN0IHJlc291cmNlIHJvb3QKLSAgICAgIGFkZFJlc291cmNlUm9vdChwcm9qZWN0LCBnZW5lcmF0ZWRSZXNvdXJjZXNEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgICAgLy8gdGFnbGlicyBtYXAgc3ludGF4IHJlcXVpcmVzIGRpc3RpbmN0IHNob3J0TmFtZXMsCi0gICAgICAvLyB3aGljaCBpcyBhIEdvb2QgVGhpbmchCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHNob3J0TmFtZSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgRmFjZXNDb25maWdCZWFuIGZhY2VzQ29uZmlnID0gZ2V0RmFjZXNDb25maWcoKTsKLSAgICAgICAgSXRlcmF0b3IgY29tcG9uZW50cyA9IGZhY2VzQ29uZmlnLmNvbXBvbmVudHMoKTsKLSAgICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBTa2lwRmlsdGVyKCkpOwotICAgICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudFRhZ0xpYnJhcnlGaWx0ZXIobmFtZXNwYWNlVVJJKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgdmFsaWRhdG9ycyA9IGZhY2VzQ29uZmlnLnZhbGlkYXRvcnMoKTsKLSAgICAgICAgdmFsaWRhdG9ycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHZhbGlkYXRvcnMsIG5ldyBWYWxpZGF0b3JUYWdMaWJyYXJ5RmlsdGVyKG5hbWVzcGFjZVVSSSkpOwotCi0gICAgICAgIEl0ZXJhdG9yIGNvbnZlcnRlcnMgPSBmYWNlc0NvbmZpZy5jb252ZXJ0ZXJzKCk7Ci0gICAgICAgIGNvbnZlcnRlcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb252ZXJ0ZXJzLCBuZXcgQ29udmVydGVyVGFnTGlicmFyeUZpbHRlcihuYW1lc3BhY2VVUkkpKTsKLQotICAgICAgICBTdHJpbmcgdGFyZ2V0UGF0aCA9ICJNRVRBLUlORi8iICsgc2hvcnROYW1lICsgIi50bGQiOwotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRSZXNvdXJjZXNEaXJlY3RvcnksIHRhcmdldFBhdGgpOwotCi0gICAgICAgIFN0cmluZyBjb25maWdQYXRoID0gIk1FVEEtSU5GLyIgKyBzaG9ydE5hbWUgKyAiLWJhc2UudGxkIjsKLSAgICAgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoY29uZmlnU291cmNlRGlyZWN0b3J5LCBjb25maWdQYXRoKTsKLQotICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotCi0gICAgICAgIGJvb2xlYW4gaGFzR2VuZXJhdGVkVGFncyA9IChjb21wb25lbnRzLmhhc05leHQoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVycy5oYXNOZXh0KCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMuaGFzTmV4dCgpKTsKLQotICAgICAgICBpZiAoaGFzR2VuZXJhdGVkVGFncyAmJiBjb25maWdGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCk7Ci0KLSAgICAgICAgICBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoc3RyZWFtLCBfWElOQ0xVREVfSlNQX1RBR19MSUJSQVJZX0RURCk7Ci0gICAgICAgICAgLy8gYmFzZSBnb2VzIGZpcnN0Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ4aSIsICJpbmNsdWRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVOYW1lc3BhY2UoInhpIiwgWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVBdHRyaWJ1dGUoImhyZWYiLCBjb25maWdGaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQXR0cmlidXRlKCJ4cG9pbnRlciIsICIvdGFnbGliLyoiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgd2hpbGUgKGNvbXBvbmVudHMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBfd3JpdGVUYWcoc3RyZWFtLCBjb21wb25lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICB3aGlsZSAoY29udmVydGVycy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIgPSAoQ29udmVydGVyQmVhbiljb252ZXJ0ZXJzLm5leHQoKTsKLSAgICAgICAgICAgIF93cml0ZVRhZyhzdHJlYW0sIGNvbnZlcnRlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvciA9IChWYWxpZGF0b3JCZWFuKXZhbGlkYXRvcnMubmV4dCgpOwotICAgICAgICAgICAgX3dyaXRlVGFnKHN0cmVhbSwgdmFsaWRhdG9yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgX3dyaXRlRW5kVGFnTGlicmFyeShzdHJlYW0pOwotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgSW5wdXRTdHJlYW0gbWVyZ2VkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICAgIC8vIGV4cGFuZCBhbGwgdGhlIHhpOmluY2x1ZGUgZWxlbWVudHMKLSAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgc2F4RmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICBzYXhGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgIFhNTFJlYWRlciBtZXJnZWRSZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgICAgbWVyZ2VkUmVhZGVyID0gbmV3IFhJbmNsdWRlRmlsdGVyKG1lcmdlZFJlYWRlciwgY29uZmlnRmlsZS50b1VSTCgpKTsKLSAgICAgICAgICAvLyBldmVuIHdpdGggdmFsaWRhdGluZz1mYWxzZSwgRFREIGlzIHN0aWxsIGRvd25sb2FkZWQgc28gdGhhdAotICAgICAgICAgIC8vIGFueSBlbnRpdGllcyBjb250YWluZWQgaW4gdGhlIGRvY3VtZW50IGNhbiBiZSBleHBhbmRlZC4KLSAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGRpc2FibGVzIHRoYXQgYmVoYXZpb3IsIGFsc28gc2F2aW5nIHRoZSB0aW1lCi0gICAgICAgICAgLy8gc3BlbnQgdG8gcGFyc2UgdGhlIERURAotICAgICAgICAgIG1lcmdlZFJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRW50aXR5UmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSWQsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgSW5wdXRTb3VyY2UgbWVyZ2VkSW5wdXQgPSBuZXcgSW5wdXRTb3VyY2UobWVyZ2VkU3RyZWFtKTsKLSAgICAgICAgICBTb3VyY2UgbWVyZ2VkU291cmNlID0gbmV3IFNBWFNvdXJjZShtZXJnZWRSZWFkZXIsIG1lcmdlZElucHV0KTsKLQotICAgICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgUmVzdWx0IG1lcmdlZFJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSkpOwotCi0gICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFRyYW5zZm9ybWVyIGlkZW50aXR5ID0gdHJhbnNGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgaWYgKCFfaXMxMigpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlkZW50aXR5LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDKTsKLSAgICAgICAgICAgIGlkZW50aXR5LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZGVudGl0eS50cmFuc2Zvcm0obWVyZ2VkU291cmNlLCBtZXJnZWRSZXN1bHQpOwotCi0gICAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGhhc0dlbmVyYXRlZFRhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgWE1MT3V0cHV0RmFjdG9yeSBvdXRwdXRGYWN0b3J5ID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0gPSBvdXRwdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQpOwotCi0gICAgICAgICAgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KHN0cmVhbSwgX2lzMTIoKSA/ICIyLjEiIDogIjEuMiIsIHNob3J0TmFtZSwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICB3aGlsZSAoY29tcG9uZW50cy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbiljb21wb25lbnRzLm5leHQoKTsKLSAgICAgICAgICAgIF93cml0ZVRhZyhzdHJlYW0sIGNvbXBvbmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlciA9IChDb252ZXJ0ZXJCZWFuKWNvbnZlcnRlcnMubmV4dCgpOwotICAgICAgICAgICAgX3dyaXRlVGFnKHN0cmVhbSwgY29udmVydGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKHZhbGlkYXRvcnMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yID0gKFZhbGlkYXRvckJlYW4pdmFsaWRhdG9ycy5uZXh0KCk7Ci0gICAgICAgICAgICBfd3JpdGVUYWcoc3RyZWFtLCB2YWxpZGF0b3IpOwotICAgICAgICAgIH0KLSAgICAgICAgICBfd3JpdGVFbmRUYWdMaWJyYXJ5KHN0cmVhbSk7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29uZmlnRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGNvcHkgaWYgbmV3ZXIKLSAgICAgICAgICBpZiAoY29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGNvbmZpZ0ZpbGUsIHRhcmdldEZpbGUpOwotICAgICAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgdGFnIGxpYnJhcnkiLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyB0YWcgbGlicmFyeSIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyB0YWcgbGlicmFyeSIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgdGFnIGxpYnJhcnkiLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgdGFnIGxpYnJhcmllcyIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBTdHJpbmcgICAgICAgICAgZHRkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVTdGFydERvY3VtZW50KCIxLjAiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgIGlmICghX2lzMTIoKSkKLSAgICAgIHN0cmVhbS53cml0ZURURChkdGQpOwotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZ2xpYiIpOwotICAgIGlmIChfaXMxMigpKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZU5hbWVzcGFjZSgiIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpOwotICAgICAgc3RyZWFtLndyaXRlTmFtZXNwYWNlKCJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKTsKLSAgICAgIHN0cmVhbS53cml0ZUF0dHJpYnV0ZSgieHNpOnNjaGVtYUxvY2F0aW9uIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIik7Ci0gICAgICBzdHJlYW0ud3JpdGVBdHRyaWJ1dGUoInZlcnNpb24iLCAiMi4xIik7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVN0YXJ0VGFnTGlicmFyeSgKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIFN0cmluZyAgICAgICAgICB2ZXJzaW9uLAotICAgIFN0cmluZyAgICAgICAgICBzaG9ydE5hbWUsCi0gICAgU3RyaW5nICAgICAgICAgIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KHN0cmVhbSwgX0pTUF9UQUdfTElCUkFSWV9EVEQpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGxpYi12ZXJzaW9uIik7Ci0gICAgU3RyaW5nIHRsaWJWZXJzaW9uID0gcHJvamVjdC5nZXRWZXJzaW9uKCk7Ci0gICAgLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgYnV0IGRld2V5LWRlY2ltYWwgY2hhcmFjdGVycyAoaS5lLiwgbnVtYmVycyBhbmQgcGVyaW9kcykKLSAgICB0bGliVmVyc2lvbiA9IHRsaWJWZXJzaW9uLnJlcGxhY2VBbGwoIlteLjAtOV0iLCAiIik7Ci0gICAgLy8gUmVtb3ZlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIHBlcmlvZHMKLSAgICB3aGlsZSAodGxpYlZlcnNpb24uc3RhcnRzV2l0aCgiLiIpKQotICAgIHsKLSAgICAgIHRsaWJWZXJzaW9uID0gdGxpYlZlcnNpb24uc3Vic3RyaW5nKDEpOwotICAgIH0KLQotICAgIHdoaWxlICh0bGliVmVyc2lvbi5lbmRzV2l0aCgiLiIpKQotICAgIHsKLSAgICAgIHRsaWJWZXJzaW9uID0gdGxpYlZlcnNpb24uc3Vic3RyaW5nKDAsIHRsaWJWZXJzaW9uLmxlbmd0aCgpIC0gMSk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyh0bGliVmVyc2lvbik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgaWYgKCFfaXMxMigpKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgianNwLXZlcnNpb24iKTsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnModmVyc2lvbik7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInNob3J0LW5hbWUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHNob3J0TmFtZSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInVyaSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMobmFtZXNwYWNlVVJJKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlRW5kVGFnTGlicmFyeSgKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUVuZERvY3VtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yIHBhcnNlZCBjb21wb25lbnQgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3dyaXRlVGFnKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgQ29tcG9uZW50QmVhbiAgIGNvbXBvbmVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0KLSAgICAvLyBJbiBKU1AgMi4xLCBkZXNjcmlwdGlvbiBnb2VzIHVwIHRvcAotICAgIGlmIChfaXMxMigpICYmIGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDRGF0YShjb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJuYW1lIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb21wb25lbnQuZ2V0VGFnTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWctY2xhc3MiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbXBvbmVudC5nZXRUYWdDbGFzcygpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAvLyBJbiBKU1AgMi4xLCBib2R5LWNvbnRlbnQgaXMgbm90IG9wdGlvbmFsCi0gICAgaWYgKF9pczEyKCkpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImJvZHktY29udGVudCIpOwotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiSlNQIik7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgR2VuZXJhdGVKc3BUYWdsaWJzTW9qby50aGlzLndyaXRlQ3VzdG9tQ29tcG9uZW50VGFnRGVzY3JpcHRvckNvbnRlbnQoc3RyZWFtLCBjb21wb25lbnQpOwotCi0gICAgLy8gSW4gSlNQIDIuMCwgZGVzY3JpcHRpb24gZ29lcyBqdXN0IGJlZm9yZSB0aGUgYXR0cmlidXRlcwotICAgIGlmICghX2lzMTIoKSAmJiBjb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgc3RyZWFtLndyaXRlQ0RhdGEoY29tcG9uZW50LmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcyh0cnVlKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIHdyaXRlVGFnQXR0cmlidXRlKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFVuc3VwcG9ydGVkQWdlbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yIHBhcnNlZCBjb252ZXJ0ZXIgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3dyaXRlVGFnKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgQ29udmVydGVyQmVhbiAgIGNvbnZlcnRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgaWYgKF9pczEyKCkgJiYgY29udmVydGVyLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICAgIHN0cmVhbS53cml0ZUNEYXRhKGNvbnZlcnRlci5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoIm5hbWUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbnZlcnRlci5nZXRUYWdOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZy1jbGFzcyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29udmVydGVyLmdldFRhZ0NsYXNzKCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIC8vIEluIEpTUCAyLjEsIGJvZHktY29udGVudCBpcyBub3Qgb3B0aW9uYWwKLSAgICBpZiAoX2lzMTIoKSkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiYm9keS1jb250ZW50Iik7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJlbXB0eSIpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIGlmICghX2lzMTIoKSAmJiBjb252ZXJ0ZXIuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgc3RyZWFtLndyaXRlQ0RhdGEoY29udmVydGVyLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8vIGNvbnZlcnRlcnMgbmVlZCBhbiBpZCBhdHRyaWJ1dGUKLSAgICB3cml0ZVRhZ0F0dHJpYnV0ZShzdHJlYW0sICJpZCIsICJ0aGUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnZlcnRlciIsIG51bGwsIG51bGwpOwotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbnZlcnRlci5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICB3cml0ZVRhZ0F0dHJpYnV0ZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRVbnN1cHBvcnRlZEFnZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVRhZ0F0dHJpYnV0ZURlc2NyaXB0aW9uKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgU3RyaW5nICAgICAgICAgIGRlc2NyaXB0aW9uLAotICAgIFN0cmluZ1tdICAgICAgICB1bnN1cHBvcnRlZEFnZW50cykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0KLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCB8fAotICAgICAgICB1bnN1cHBvcnRlZEFnZW50cy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0KLSAgICAgIGlmICh1bnN1cHBvcnRlZEFnZW50cyAhPSBudWxsICYmCi0gICAgICAgICAgdW5zdXBwb3J0ZWRBZ2VudHMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0gICAgICAgICAgZGVzY3JpcHRpb24gPSAiIjsKLQotICAgICAgICBkZXNjcmlwdGlvbiArPSAiXG5cbiAgICBUaGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBmb2xsb3dpbmcgYWdlbnQgdHlwZXM6XG4iOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHVuc3VwcG9ydGVkQWdlbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiAiICsgdW5zdXBwb3J0ZWRBZ2VudHNbaV07Ci0gICAgICAgICAgZGVzY3JpcHRpb24gKz0gKGkgPCB1bnN1cHBvcnRlZEFnZW50cy5sZW5ndGggLSAxKSA/ICIsIiA6ICIuIjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBzdHJlYW0ud3JpdGVDRGF0YShkZXNjcmlwdGlvbik7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVUYWdBdHRyaWJ1dGUoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBTdHJpbmcgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgIFN0cmluZyAgICAgICAgICBkZXNjcmlwdGlvbiwKLSAgICBTdHJpbmdbXSAgICAgICAgdW5zdXBwb3J0ZWRBZ2VudHMsCi0gICAgUHJvcGVydHlCZWFuICAgIHByb3BlcnR5KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImF0dHJpYnV0ZSIpOwotCi0gICAgLy8gSW4gSlNQIDIuMSwgdGhlIGRlc2NyaXB0aW9uIGdvZXMgYXQgdGhlIGJlZ2lubmluZwotICAgIGlmIChfaXMxMigpKQotICAgICAgX3dyaXRlVGFnQXR0cmlidXRlRGVzY3JpcHRpb24oc3RyZWFtLCBkZXNjcmlwdGlvbiwgdW5zdXBwb3J0ZWRBZ2VudHMpOwotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoIm5hbWUiKTsKLSAgICAKLSAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMocHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkpOwotICAgIGVsc2UKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMocHJvcGVydHlOYW1lKTsKLQotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIGlmICghX2lzMTIoKSkKLSAgICB7Ci0gICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBpZiAocHJvcGVydHkuaXNSZXF1aXJlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJyZXF1aXJlZCIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoInRydWUiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJydGV4cHJ2YWx1ZSIpOwotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiZmFsc2UiKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgIAotICAgICAgLy8gSW4gSlNQIDIuMCwgdGhlIHRhZyBkZXNjcmlwdGlvbiBnb2VzIGF0IHRoZSBlbmQKLSAgICAgIF93cml0ZVRhZ0F0dHJpYnV0ZURlc2NyaXB0aW9uKHN0cmVhbSwgZGVzY3JpcHRpb24sIHVuc3VwcG9ydGVkQWdlbnRzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAocHJvcGVydHkuaXNSZXF1aXJlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJyZXF1aXJlZCIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoInRydWUiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSB8fCBwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVmZXJyZWQtbWV0aG9kIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgICAgICBNZXRob2RTaWduYXR1cmVCZWFuIHNpZyA9IHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKTsKLSAgICAgICAgICBpZiAoc2lnICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJtZXRob2Qtc2lnbmF0dXJlIik7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHNpZy5nZXRSZXR1cm5UeXBlKCkpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiIG15TWV0aG9kKCIpOwotICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1zID0gc2lnLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIiwgIik7Ci0gICAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMocGFyYW1zW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiKSIpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSB8fAotICAgICAgICAgICAgICAgICAvLyAiYmluZGluZyIgaXMgYWx3YXlzIGEgZGVmZXJyZWQtdmFsdWUKLSAgICAgICAgICAgICAgICAgImJpbmRpbmciLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlZmVycmVkLXZhbHVlIik7Ci0gICAgICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICAgICAgLy8gV3JpdGluZyBqYXZhLmxhbmcuU3RyaW5nIGlzIHVzdWFsbHkgYSBiYWQgaWRlYSAtIGl0Ci0gICAgICAgICAgLy8gbWVhbnMgdGhhdCBudWxsIGdldHMgY29lcmNlZCB0byB0aGUgZW1wdHkgc3RyaW5nLgotICAgICAgICAgIGlmICgoImphdmEubGFuZy5TdHJpbmciLmVxdWFscyhwcm9wZXJ0eUNsYXNzKSAmJiBjb2VyY2VTdHJpbmdzKSB8fAotICAgICAgICAgICAgICBfQ0FOX0NPRVJDRS5jb250YWlucyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgICAiKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidHlwZSIpOwotICAgICAgICAgICAgLy8gVHJpbSBvdXQgYW55IHVzZSBvZiBnZW5lcmljcyBoZXJlIC0gc2luY2UgSlNQIGNvZXJjaW9uCi0gICAgICAgICAgICAvLyBjZXJ0YWlubHkgY2FuJ3QgZG8gYW55dGhpbmcgdGhlcmUKLSAgICAgICAgICAgIGludCBnZW5lcmljSW5kZXggPSBwcm9wZXJ0eUNsYXNzLmluZGV4T2YoJzwnKTsKLSAgICAgICAgICAgIGlmIChnZW5lcmljSW5kZXggPiAwKQotICAgICAgICAgICAgICBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHlDbGFzcy5zdWJzdHJpbmcoMCwgZ2VuZXJpY0luZGV4KTsKLQotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhwcm9wZXJ0eUNsYXNzKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzUnRleHBydmFsdWUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgicnRleHBydmFsdWUiKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoInRydWUiKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgicnRleHBydmFsdWUiKTsKLSAgICAgICAgICAvLyBBcyBvZiBKU0YgMS4yLCAiaWQiIGNhbiBiZSBzZXQgdmlhIGFuIHJ0ZXhwcnZhbHVlIChidXQKLSAgICAgICAgICAvLyAqbm90KiBieSBhIFZhbHVlRXhwcmVzc2lvbikgLSBpdCBoYXMgdG8gYmUgZXZhbHVhdGVkCi0gICAgICAgICAgLy8gaW4gdGhlIEpTUAotICAgICAgICAgIGlmICgiaWQiLmVxdWFscyhwcm9wZXJ0eU5hbWUpICYmICFkaXNhYmxlSWRFeHByZXNzaW9ucykKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoInRydWUiKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJmYWxzZSIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgcGFyc2VkIHZhbGlkYXRvciBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUYWcoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBWYWxpZGF0b3JCZWFuICAgdmFsaWRhdG9yKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWciKTsKLQotICAgIGlmIChfaXMxMigpICYmIHZhbGlkYXRvci5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDRGF0YSh2YWxpZGF0b3IuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJuYW1lIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyh2YWxpZGF0b3IuZ2V0VGFnTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWctY2xhc3MiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHZhbGlkYXRvci5nZXRUYWdDbGFzcygpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAvLyBJbiBKU1AgMi4xLCBib2R5LWNvbnRlbnQgaXMgbm90IG9wdGlvbmFsCi0gICAgaWYgKF9pczEyKCkpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImJvZHktY29udGVudCIpOwotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiZW1wdHkiKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBpZiAoIV9pczEyKCkgJiYgdmFsaWRhdG9yLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICAgIHN0cmVhbS53cml0ZUNEYXRhKHZhbGlkYXRvci5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvLyB2YWxpZGF0b3JzIG5lZWQgYW4gaWQgYXR0cmlidXRlCi0gICAgd3JpdGVUYWdBdHRyaWJ1dGUoc3RyZWFtLCAiaWQiLCAidGhlIGlkZW50aWZpZXIgZm9yIHRoZSB2YWxpZGF0b3IiLCBudWxsLCBudWxsKTsKLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSB2YWxpZGF0b3IucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotICAgICAgd3JpdGVUYWdBdHRyaWJ1dGUoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGhhbmRsZXJzIGZvciBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVRhZ0hhbmRsZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgZ2VuZXJhdGVkIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAvLyBpcyBhZGRlZCB0byBjb21waWxhdGlvbiBzb3VyY2UgcGF0aAotICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgIGlmICghZmFjZXNDb25maWcuaGFzQ29tcG9uZW50cygpICYmICFmYWNlc0NvbmZpZy5oYXNDb252ZXJ0ZXJzKCkgJiYgIWZhY2VzQ29uZmlnLmhhc1ZhbGlkYXRvcnMoKSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gbm8gY29tcG9uZW50cyBmb3VuZCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSXRlcmF0b3IgY29tcG9uZW50cyA9IGZhY2VzQ29uZmlnLmNvbXBvbmVudHMoKTsKLSAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgU2tpcEZpbHRlcigpKTsKLSAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgQ29tcG9uZW50VGFnRmlsdGVyKCkpOwotICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBDb21wb25lbnRUYWdDbGFzc0ZpbHRlcihwYWNrYWdlQ29udGFpbnMpKTsKLQotICAgICAgSXRlcmF0b3IgdmFsaWRhdG9ycyA9IGZhY2VzQ29uZmlnLnZhbGlkYXRvcnMoKTsKLSAgICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yVGFnRmlsdGVyKCkpOwotICAgICAgdmFsaWRhdG9ycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHZhbGlkYXRvcnMsIG5ldyBWYWxpZGF0b3JUYWdDbGFzc0ZpbHRlcihwYWNrYWdlQ29udGFpbnMpKTsKLQotICAgICAgSXRlcmF0b3IgY29udmVydGVycyA9IGZhY2VzQ29uZmlnLmNvbnZlcnRlcnMoKTsKLSAgICAgIGNvbnZlcnRlcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb252ZXJ0ZXJzLCBuZXcgQ29udmVydGVyVGFnRmlsdGVyKCkpOwotICAgICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJUYWdDbGFzc0ZpbHRlcihwYWNrYWdlQ29udGFpbnMpKTsKLQotICAgICAgLy8gaW5jcmVtZW50YWwgdW5sZXNzIGZvcmNlZAotICAgICAgaWYgKCFmb3JjZSkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBJZkNvbXBvbmVudE1vZGlmaWVkRmlsdGVyKCkpOwotICAgICAgICBjb252ZXJ0ZXJzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29udmVydGVycywgbmV3IElmQ29udmVydGVyTW9kaWZpZWRGaWx0ZXIoKSk7Ci0gICAgICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgSWZWYWxpZGF0b3JNb2RpZmllZEZpbHRlcigpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFjb21wb25lbnRzLmhhc05leHQoKSAmJiAhY29udmVydGVycy5oYXNOZXh0KCkgJiYgIXZhbGlkYXRvcnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gYWxsIEpTUCB0YWdzIGFyZSB1cCB0byBkYXRlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFRhZ0hhbmRsZXJHZW5lcmF0b3IgY29tcG9uZW50R2VuID0gbmV3IENvbXBvbmVudFRhZ0hhbmRsZXJHZW5lcmF0b3IoKTsKLSAgICAgICAgQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IgY29udmVydGVyR2VuID0gbnVsbDsKLSAgICAgICAgQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IgdmFsaWRhdG9yR2VuID0gbnVsbDsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAidHJpbmlkYWQiLmVxdWFscyh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbnZlcnRlckdlbiA9IG5ldyBUcmluaWRhZENvbnZlcnRlclRhZ0dlbmVyYXRvcihpczEyKCksIGdldExpY2Vuc2VIZWFkZXIoKSwgZ2V0TG9nKCkpOwotICAgICAgICAgIHZhbGlkYXRvckdlbiA9IG5ldyBUcmluaWRhZFZhbGlkYXRvclRhZ0dlbmVyYXRvcihpczEyKCksIGdldExpY2Vuc2VIZWFkZXIoKSwgZ2V0TG9nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbnZlcnRlckdlbiA9IG5ldyBNeUZhY2VzQ29udmVydGVyVGFnR2VuZXJhdG9yKGlzMTIoKSwgZ2V0TGljZW5zZUhlYWRlcigpLCBnZXRMb2coKSk7Ci0gICAgICAgICAgdmFsaWRhdG9yR2VuID0gbmV3IE15RmFjZXNWYWxpZGF0b3JUYWdHZW5lcmF0b3IoaXMxMigpLCBnZXRMaWNlbnNlSGVhZGVyKCksIGdldExvZygpKTsgICAgCi0gICAgICAgIH0KLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGNvbXBvbmVudHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbiljb21wb25lbnRzLm5leHQoKTsKLSAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pc1RhZ0NsYXNzRXhjbHVkZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbXBvbmVudEdlbi5nZW5lcmF0ZVRhZ0hhbmRsZXIoY29tcG9uZW50KTsKLSAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGNvbnZlcnRlcnMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIgPSAoQ29udmVydGVyQmVhbiljb252ZXJ0ZXJzLm5leHQoKTsKLSAgICAgICAgICBpZiAoIWNvbnZlcnRlci5pc1RhZ0NsYXNzRXhjbHVkZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbnZlcnRlckdlbi5nZW5lcmF0ZVRhZ0hhbmRsZXIoY29udmVydGVyLCBnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkpOwotICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAodmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvciA9IChWYWxpZGF0b3JCZWFuKXZhbGlkYXRvcnMubmV4dCgpOwotICAgICAgICAgIGlmICghdmFsaWRhdG9yLmlzVGFnQ2xhc3NFeGNsdWRlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsaWRhdG9yR2VuLmdlbmVyYXRlVGFnSGFuZGxlcih2YWxpZGF0b3IsIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgICAgICAgIGNvdW50Kys7ICAgIAotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGVkICIgKyBjb3VudCArICIgSlNQIHRhZyhzKSIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGNsYXNzIENvbXBvbmVudFRhZ0hhbmRsZXJHZW5lcmF0b3IKLSAgewotICAgIAotICAgIHByaXZhdGUgU2V0IGluaXRDb21wb25lbnRMaXN0KENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUpCi0gICAgewotICAgICAgU2V0IGNvbXBvbmVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotICAgICAgY29tcG9uZW50TGlzdC5hZGQoY29tcG9uZW50KTsKLQotICAgICAgQ29tcG9uZW50QmVhbiBsQmVhbiA9IGNvbXBvbmVudDsKLSAgICAgIHdoaWxlICgobEJlYW4gPSBsQmVhbi5yZXNvbHZlU3VwZXJ0eXBlKCkpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAhZnVsbFN1cGVyY2xhc3NOYW1lLmVxdWFscyhsQmVhbi5nZXRUYWdDbGFzcygpKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSsKLSAgICAgICAgICAgICAgICAgICAgICAgIjogQWRkIGFkZGl0aW9uYWwgVGFncyBmcm9tOiAiICsgbEJlYW4uZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgY29tcG9uZW50TGlzdC5hZGQobEJlYW4pOwotICAgICAgfQotCi0gICAgICByZXR1cm4gY29tcG9uZW50TGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVRhZ0hhbmRsZXIoQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgQ29tcG9uZW50VGFnR2VuZXJhdG9yIGdlbmVyYXRvcjsKLSAgICAgIFNldCBjb21wb25lbnRMaXN0OwotICAgICAgCi0gICAgICBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lID0gY29tcG9uZW50LmZpbmRKc3BUYWdTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAKLSAgICAgIGlmIChmdWxsU3VwZXJjbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkud2FybigiTWlzc2luZyBKU1AgVGFnIHN1cGVyY2xhc3MgZm9yIGNvbXBvbmVudDogIiArIGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZW5lcmF0aW9uIG9mIHRoaXMgVGFnIGlzIHNraXBwZWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfWVsc2V7Ci0gICAgICAgICAgaWYgKGlzMTIoKSAmJiAiamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnIi5lcXVhbHNJZ25vcmVDYXNlKGZ1bGxTdXBlcmNsYXNzTmFtZSkpewotICAgICAgICAgICAgICBmdWxsU3VwZXJjbGFzc05hbWUgPSAiamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50RUxUYWciOwotICAgICAgICAgIH1lbHNlIGlmICghaXMxMigpICYmICJqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRFTFRhZyIuZXF1YWxzSWdub3JlQ2FzZShmdWxsU3VwZXJjbGFzc05hbWUpKXsKLSAgICAgICAgICAgICAgZnVsbFN1cGVyY2xhc3NOYW1lID0gImphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudFRhZyI7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBjb21wb25lbnRMaXN0ID0gaW5pdENvbXBvbmVudExpc3QoY29tcG9uZW50LCBmdWxsU3VwZXJjbGFzc05hbWUpOwotICAgICAgCi0gICAgICBTdHJpbmcgZnVsbENsYXNzTmFtZSA9IGNvbXBvbmVudC5nZXRUYWdDbGFzcygpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nICIgKyBmdWxsQ2xhc3NOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgoZnVsbENsYXNzTmFtZSwgIi5qYXZhIik7Ci0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0gICAgICAgIAotICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBQcmV0dHlXcml0ZXIgb3V0ID0gbmV3IFByZXR0eVdyaXRlcihzdyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY29tcG9uZW50LmlzVHJpbmlkYWRDb21wb25lbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIGdlbmVyYXRvciA9IG5ldyBUcmluaWRhZENvbXBvbmVudFRhZ0dlbmVyYXRvcihfaXMxMigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZW5lcmF0b3IgPSBuZXcgTXlGYWNlc0NvbXBvbmVudFRhZ0dlbmVyYXRvcihfaXMxMigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nICIgKyBmdWxsQ2xhc3NOYW1lKyIsIHdpdGggZ2VuZXJhdG9yOiAiK2dlbmVyYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZ1bGxDbGFzc05hbWUpOwotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGZ1bGxDbGFzc05hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gaGVhZGVyL2NvcHlyaWdodAotICAgICAgICB3cml0ZVByZWFtYmxlKG91dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBwYWNrYWdlCi0gICAgICAgIG91dC5wcmludGxuKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7Iik7Ci0gICAgICAgIAotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZnVsbFN1cGVyY2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKHN1cGVyY2xhc3NOYW1lLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgc3VwZXJjbGFzc05hbWUgPSBmdWxsU3VwZXJjbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudEZ1bGxDbGFzcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpOwotICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhjb21wb25lbnRGdWxsQ2xhc3MpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlSW1wb3J0cyhvdXQsIG51bGwsIHBhY2thZ2VOYW1lLCBmdWxsU3VwZXJjbGFzc05hbWUsIHN1cGVyY2xhc3NOYW1lLCBjb21wb25lbnRMaXN0KTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUNsYXNzQmVnaW4ob3V0LCBjbGFzc05hbWUsIHN1cGVyY2xhc3NOYW1lLCBjb21wb25lbnQsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgaW50IG1vZGlmaWVycyA9IGNvbXBvbmVudC5nZXRUYWdDbGFzc01vZGlmaWVycygpOwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVDb25zdHJ1Y3RvcihvdXQsIGNvbXBvbmVudCwgbW9kaWZpZXJzKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAoIU1vZGlmaWVyLmlzQWJzdHJhY3QobW9kaWZpZXJzKSkKLSAgICAgICAgewotICAgICAgICAgIGdlbmVyYXRvci53cml0ZUdldENvbXBvbmVudFR5cGUob3V0LCBjb21wb25lbnQpOwotICAgICAgICAgIGdlbmVyYXRvci53cml0ZUdldFJlbmRlcmVyVHlwZShvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBHZW5lcmF0ZUpzcFRhZ2xpYnNNb2pvLnRoaXMud3JpdGVDdXN0b21Db21wb25lbnRUYWdIYW5kbGVyQ29udGVudChvdXQsIGNvbXBvbmVudCk7Ci0KLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlUHJvcGVydHlNZW1iZXJzKG91dCwgY29tcG9uZW50TGlzdCk7Ci0gICAgICAgIGdlbmVyYXRvci53cml0ZVNldFByb3BlcnRpZXNNZXRob2Qob3V0LCBjb21wb25lbnRDbGFzcywgY29tcG9uZW50TGlzdCk7Ci0gICAgICAgIGdlbmVyYXRvci53cml0ZVJlbGVhc2VNZXRob2Qob3V0LCBjb21wb25lbnRMaXN0KTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUNsYXNzRW5kKG91dCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gZGVsYXkgd3JpdGUgaW4gY2FzZSBvZiBlcnJvcgotICAgICAgICAvLyB0aW1lc3RhbXAgc2hvdWxkIG5vdCBiZSB1cGRhdGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICAgIC8vIGRlbGV0ZSB0YXJnZXQgZmlsZSBmaXJzdCwgYmVjYXVzZSBpdCBpcyByZWFkb25seQotICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIodGFyZ2V0RmlsZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBzdy5nZXRCdWZmZXIoKTsKLSAgICAgICAgZncud3JpdGUoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICBmdy5jbG9zZSgpOwotICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmVycm9yKCJFcnJvciBnZW5lcmF0aW5nICIgKyBmdWxsQ2xhc3NOYW1lLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpczEyKCkKLSAgewotICAgIHJldHVybiAiMS4yIi5lcXVhbHMoanNmVmVyc2lvbikgfHwgIjEyIi5lcXVhbHMoanNmVmVyc2lvbik7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX2lzMTIoKQotICB7Ci0gICAgcmV0dXJuIGlzMTIoKTsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSWZDb21wb25lbnRNb2RpZmllZEZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gY29tcG9uZW50LmdldFRhZ0NsYXNzKCk7Ci0gICAgICBTdHJpbmcgc291cmNlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKHRhZ0NsYXNzLCAiLmphdmEiKTsKLSAgICAgIFN0cmluZyB0ZW1wbGF0ZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCh0YWdDbGFzcywgIlRlbXBsYXRlLmphdmEiKTsKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0gICAgICBGaWxlIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCB0ZW1wbGF0ZVBhdGgpOwotCi0gICAgICAvLyBhY2NlcHQgaWYgdGVtcGxhdGVGaWxlIGlzIG5ld2VyIG9yIGNvbXBvbmVudCBoYXMgYmVlbiBtb2RpZmllZAotICAgICAgcmV0dXJuICh0ZW1wbGF0ZUZpbGUubGFzdE1vZGlmaWVkKCkgPiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpIHx8Ci0gICAgICAgICAgICAgIGNvbXBvbmVudC5pc01vZGlmaWVkU2luY2UodGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSWZDb252ZXJ0ZXJNb2RpZmllZEZpbHRlciBleHRlbmRzIENvbnZlcnRlckZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpCi0gICAgewotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gY29udmVydGVyLmdldFRhZ0NsYXNzKCk7Ci0gICAgICBTdHJpbmcgc291cmNlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKHRhZ0NsYXNzLCAiLmphdmEiKTsKLSAgICAgIFN0cmluZyB0ZW1wbGF0ZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCh0YWdDbGFzcywgIlRlbXBsYXRlLmphdmEiKTsKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0gICAgICBGaWxlIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCB0ZW1wbGF0ZVBhdGgpOwotCi0gICAgICAvLyBhY2NlcHQgaWYgdGVtcGxhdGVGaWxlIGlzIG5ld2VyIG9yIGNvbXBvbmVudCBoYXMgYmVlbiBtb2RpZmllZAotICAgICAgcmV0dXJuICh0ZW1wbGF0ZUZpbGUubGFzdE1vZGlmaWVkKCkgPiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpIHx8Ci0gICAgICAgICAgICAgIGNvbnZlcnRlci5pc01vZGlmaWVkU2luY2UodGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSWZWYWxpZGF0b3JNb2RpZmllZEZpbHRlciBleHRlbmRzIFZhbGlkYXRvckZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpCi0gICAgewotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCk7Ci0gICAgICBTdHJpbmcgc291cmNlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKHRhZ0NsYXNzLCAiLmphdmEiKTsKLSAgICAgIFN0cmluZyB0ZW1wbGF0ZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCh0YWdDbGFzcywgIlRlbXBsYXRlLmphdmEiKTsKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0gICAgICBGaWxlIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCB0ZW1wbGF0ZVBhdGgpOwotCi0gICAgICAvLyBhY2NlcHQgaWYgdGVtcGxhdGVGaWxlIGlzIG5ld2VyIG9yIGNvbXBvbmVudCBoYXMgYmVlbiBtb2RpZmllZAotICAgICAgcmV0dXJuICh0ZW1wbGF0ZUZpbGUubGFzdE1vZGlmaWVkKCkgPiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpIHx8Ci0gICAgICAgICAgICAgIHZhbGlkYXRvci5pc01vZGlmaWVkU2luY2UodGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByb3RlY3RlZCBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByb3RlY3RlZCBNYXAgdGFnbGliczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZmFjZXMtY29uZmlnLnhtbCIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVBhdGg7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vY29uZiIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRmlsZSBjb25maWdTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YS10ZW1wbGF0ZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEZpbGUgdGVtcGxhdGVTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vamF2YSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vcmVzb3VyY2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByb3RlY3RlZCBGaWxlIGdlbmVyYXRlZFJlc291cmNlc0RpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlQ29udGFpbnMgPSAiIjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZm9yY2U7Ci0KLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzYWJsZUlkRXhwcmVzc2lvbnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGNvZXJjZVN0cmluZ3M7Ci0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBqc2ZWZXJzaW9uOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InRyaW5pZGFkIgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCi0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMgPQotICAgICAgICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSA9Ci0gICAgICAgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0pTUF9UQUdfTElCUkFSWV9EVEQgPQotICAgICI8IURPQ1RZUEUgdGFnbGliIFBVQkxJQyBcbiIgKwotICAgICIgIFwiIiArIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMgKyAiXCJcbiIgKwotICAgICIgIFwiIiArIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0gKyAiXCIgPlxuIjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX1hJTkNMVURFX0pTUF9UQUdfTElCUkFSWV9EVEQgPQotICAgICI8IURPQ1RZUEUgdGFnbGliIFBVQkxJQ1xuIiArCi0gICAgIiAgXCIiICsgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyArICJcIlxuIiArCi0gICAgIiAgXCIiICsgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSArICJcIiBbXG4iICsKLSAgICAiICAgICAgPCFFTEVNRU5UIHhpOmluY2x1ZGUgRU1QVFk+XG4iICsKLSAgICAiICAgICAgPCFBVFRMSVNUIHhpOmluY2x1ZGVcbiIgKwotICAgICIgICAgICAgICAgeG1sbnM6eGkgQ0RBVEEgI0ZJWEVEICBcIiIgKyBYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UgKyAiXCJcbiIgKwotICAgICIgICAgICAgICAgaHJlZiAgICAgQ0RBVEEgI0lNUExJRURcbiIgKwotICAgICIgICAgICAgICAgeHBvaW50ZXIgQ0RBVEEgI0lNUExJRUQ+XG4iICsKLSAgICAiXT5cbiI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU2V0IF9DQU5fQ09FUkNFID0gbmV3IEhhc2hTZXQoKTsKLSAgc3RhdGljCi0gIHsKLSAgICAvLyBXaGF0PyAgQ2FuJ3QgY29lcmNlIFN0cmluZ3M/ICBIb3cgY291bGQgdGhhdCBiZT8gIFdlbGwsIHRha2UgYSBsb29rIGF0OgotICAgIC8vICAgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FERkZBQ0VTLTM3NwotICAgIC8vIFRoZSBzaWxseSBjb2VyY2lvbiBydWxlcyBpbiBKU1AgY29udmVydCBudWxsIHRvIHRoZQotICAgIC8vIGVtcHR5IHN0cmluZy4gIFNvIGl0J3Mgbm90IHRoYXQgd2UgY2FuJ3QgY29lcmNlIHRvCi0gICAgLy8gU3RyaW5nLCB3ZSBqdXN0IHJlYWxseSwgcmVhbGx5IGRvbid0IHdhbnQgdG8uCi0gICAgLy8gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgLy8gVE9ETzogY29uc2lkZXIgZ2V0dGluZyByaWQgb2YgY29lcmNpb24gcnVsZXMgZm9yCi0gICAgLy8gYWxsIG5vbi1wcmltaXRpdmVzCi0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuSW50ZWdlciIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLkxvbmciKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5Cb29sZWFuIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuRG91YmxlIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuRmxvYXQiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5TaG9ydCIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLkNoYXJhY3RlciIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLkJ5dGUiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImludCIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgibG9uZyIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiYm9vbGVhbiIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiZG91YmxlIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJmbG9hdCIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgic2hvcnQiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImNoYXIiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImJ5dGUiKTsKLQotICAgIC8vIFNlZSBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQURGRkFDRVMtNDc3OiAgZm9yCi0gICAgLy8gImJpbmRpbmciIGFuZCAiY29udmVydGVyIiBwcm9wZXJ0aWVzLCB3ZSB3YW50IHRoZSBkZWZlcnJlZC10eXBlcwotICAgIC8vIHRoZXJlLiAgSGFyZGNvZGluZyB0aGVzZSBoZXJlIGlzIHZlcnkgdWdseSwgYnV0IHB1dHRpbmcgaW4KLSAgICAvLyBhbGwgY29lcmNpb24gcnVsZXMgd291bGQgYnJlYWsgaG93IFRyaW5pZGFkIGhhbmRsZXMgRGF0ZXMsCi0gICAgLy8gYW5kIExpc3RzIG9mIENvbG9ycywgZXRjLiAtIGZvciB0aG9zZSwgd2Ugd2FudCB0byBzdXBwb3J0Ci0gICAgLy8gcmF3IFN0cmluZ3MgKHdoaWNoIHRoZSBKU1AgZW5naW5lIGRvZXNuJ3Qga25vdyBob3cgdG8gY29lcmNlKQotICAgIC8vIGFuZCBjb2VyY2UgdGhlbSBvdXJzZWx2ZXMgaW4gdGhlIHRhZy4KLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudCIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXIiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlTWFzdGVyRmFjZXNDb25maWdNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVNYXN0ZXJGYWNlc0NvbmZpZ01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2NWQ2MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVNYXN0ZXJGYWNlc0NvbmZpZ01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIGdlbmVyYXRlLW1hc3Rlci1mYWNlcy1jb25maWcKLSAqIEBwaGFzZSBnZW5lcmF0ZS1yZXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlTWFzdGVyRmFjZXNDb25maWdNb2pvIGV4dGVuZHMgQWJzdHJhY3RGYWNlc01vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGFkZFJlc291cmNlUm9vdChwcm9qZWN0LCB0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgICAgLy8gU2NhbiBmb3IgLnhydHMgc291cmNlcwotICAgICAgU3RyaW5nIFtdIHhtbEZpbGVzOwotICAgICAgCi0gICAgICBpZiAoaW5oZXJpdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICAgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgCi0gICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgICAgICBzY2FubmVyLnNldEJhc2VkaXIobmV3IEZpbGUoc291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKSk7Ci0gICAgICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgICBzY2FubmVyLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ICIqKi8qLnhtbCIgfSk7Ci0gICAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgICBzY2FubmVyLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc2Nhbm5lci5zY2FuKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIFtdIHNvdXJjZUZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlcy5sZW5ndGg7aSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2V0LmFkZChzb3VyY2VGaWxlc1tpXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIHNjYW5uZXIuc2V0QmFzZWRpcihuZXcgRmlsZShpbmhlcml0ZWREaXJlY3Rvcnksc291cmNlUGF0aCkpOwotICAgICAgICAgIHNjYW5uZXIuc2NhbigpOwotICAgICAgICAgIAotICAgICAgICAgIHNvdXJjZUZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlcy5sZW5ndGg7aSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2V0LmFkZChzb3VyY2VGaWxlc1tpXSk7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgT2JqZWN0IFtdIHJlc3VsdCA9IHNldC50b0FycmF5KCk7Ci0gICAgICAgICAgeG1sRmlsZXMgPSBuZXcgU3RyaW5nW3Jlc3VsdC5sZW5ndGhdOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeG1sRmlsZXNbaV0gPSAoU3RyaW5nKSByZXN1bHRbaV07Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7Ci0gICAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKG5ldyBGaWxlKHNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCkpOwotICAgICAgICAgIHNjYW5uZXIuYWRkRGVmYXVsdEV4Y2x1ZGVzKCk7Ci0gICAgICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyAiKiovKi54bWwiIH0pOwotICAgICAgICAgIGlmIChleGNsdWRlcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2Nhbm5lci5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHNjYW5uZXIuc2NhbigpOwotICAgICAgICAgIAotICAgICAgICAgIHhtbEZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICB9Ci0KLSAgICAgIAotCi0gICAgICBsb25nIGxhc3RNb2RpZmllZCA9IDBMOwotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgeG1sRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGxhc3RNb2RpZmllZCA9IE1hdGgubWF4KGxhc3RNb2RpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoeG1sRmlsZXNbaV0pLmxhc3RNb2RpZmllZCgpKTsKLSAgICAgIH0KLQotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLQotICAgICAgaWYgKCFmb3JjZSAmJiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpID4gbGFzdE1vZGlmaWVkKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gIiArIHRhcmdldFBhdGggKyAiIGlzIHVwIHRvIGRhdGUiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyAiICsgdGFyZ2V0UGF0aCk7Ci0KLSAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0KLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKSk7Ci0gICAgICAgIFhNTE91dHB1dEZhY3Rvcnkgb3V0cHV0RmFjdG9yeSA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9ICBvdXRwdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQpOwotICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCIxLjAiKTsKLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJmYWNlcy1jb25maWciKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRGVmYXVsdE5hbWVzcGFjZSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7Ci0gICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZSgieGkiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIpOwotICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB4bWxGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB4bWxGaWxlID0geG1sRmlsZXNbaV07Ci0gICAgICAgICAgaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhtbEZpbGUgPSB4bWxGaWxlLnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKCIgICIpOwotICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIsICJpbmNsdWRlIik7Ci0gICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKCJocmVmIiwgeG1sRmlsZSk7Ci0gICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKCJ4cG9pbnRlciIsICIvZmFjZXMtY29uZmlnLyoiKTsKLSAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLQotICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZ1tdIGV4Y2x1ZGVzOwotCi0gLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luIjsKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBzb3VyY2VQYXRoOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgc291cmNlRGlyZWN0b3J5OwotICAKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgCi0gICAqLyAgCi0gIHByaXZhdGUgRmlsZSBpbmhlcml0ZWREaXJlY3Rvcnk7Ci0gIAotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFBhdGggPSAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWZhY2VzLXBsdWdpbi9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVSZW5kZXJlck1hcE1vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZVJlbmRlcmVyTWFwTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzdjMmM1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZVJlbmRlcmVyTWFwTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlJlbmRlcktpdEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5SZW5kZXJlckJlYW47Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgZ2VuZXJhdGUtcmVuZGVyZXItbWFwCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVSZW5kZXJlck1hcE1vam8gZXh0ZW5kcyBBYnN0cmFjdEZhY2VzTW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcHJvY2Vzc0luZGV4KHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0gICAgICBfZ2VuZXJhdGVSZW5kZXJlck1hcCgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb21wb25lbnRzIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBwYXJzZWQgY29tcG9uZW50cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfZ2VuZXJhdGVSZW5kZXJlck1hcCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gTWFrZSBzdXJlIGdlbmVyYXRlZCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgLy8gaXMgYWRkZWQgdG8gY29tcGlsYXRpb24gc291cmNlIHBhdGgKLSAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgRmFjZXNDb25maWdCZWFuIGZhY2VzQ29uZmlnID0gZ2V0RmFjZXNDb25maWcoKTsKLSAgICBpZiAoIWZhY2VzQ29uZmlnLmhhc1JlbmRlcktpdHMoKSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gbm8gcmVuZGVya2l0cyBmb3VuZCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSXRlcmF0b3IgcmVuZGVya2l0cyA9IGZhY2VzQ29uZmlnLnJlbmRlcktpdHMoKTsKLSAgICAgIHdoaWxlIChyZW5kZXJraXRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUmVuZGVyS2l0QmVhbiByZW5kZXJraXQgPSAoUmVuZGVyS2l0QmVhbikgcmVuZGVya2l0cy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IHJlbmRlcmtpdC5nZXRSZW5kZXJLaXRJZCgpOwotICAgICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgocmVuZGVyS2l0UHJlZml4KSkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgX3dyaXRlUmVuZGVyS2l0TWFwKHJlbmRlcmtpdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVJlbmRlcktpdE1hcChSZW5kZXJLaXRCZWFuIHJrKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL01FVEEtSU5GLyIgKyByay5nZXRSZW5kZXJLaXRJZCgpICsgIi5yZW5kZXJraXQiKTsKLSAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIob3V0RmlsZSk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoZncpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHJlbmRlcmVycyA9IHJrLnJlbmRlcmVycygpOwotICAgICAgd2hpbGUgKHJlbmRlcmVycy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFJlbmRlcmVyQmVhbiByID0gKFJlbmRlcmVyQmVhbikgcmVuZGVyZXJzLm5leHQoKTsKLSAgICAgICAgcHcucHJpbnQoci5nZXRDb21wb25lbnRGYW1pbHkoKSk7Ci0gICAgICAgIHB3LnByaW50KCd8Jyk7Ci0gICAgICAgIHB3LnByaW50KHIuZ2V0UmVuZGVyZXJUeXBlKCkpOwotICAgICAgICBwdy5wcmludCgnPScpOwotICAgICAgICBwdy5wcmludGxuKHIuZ2V0UmVuZGVyZXJDbGFzcygpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIHB3LmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9pbmRleC5sc3QiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWZhY2VzLXBsdWdpbi9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVuZGVyS2l0UHJlZml4OwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9DbGFzc0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9DbGFzc0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQ4ZjUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvQ2xhc3NHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlNvdXJjZVRlbXBsYXRlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0b3IKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NHZW5lcmF0b3IKLXsKLSAgdm9pZCB3cml0ZUltcG9ydHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUsCi0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lLAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpOwotCi0gIHZvaWQgd3JpdGVJbXBvcnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlLAotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbGxlY3Rpb24gY29tcG9uZW50cyk7Ci0KLSAgdm9pZCB3cml0ZUNsYXNzQmVnaW4oCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUpOwotCi0gIHZvaWQgd3JpdGVDb25zdHJ1Y3RvcigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgIGludCBtb2RpZmllcnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlQ2xhc3NFbmQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0KTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9HZW5lcmF0b3JIZWxwZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvR2VuZXJhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjZkNWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9HZW5lcmF0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRPRE86IGNvbW1lbnQgdGhpcyEKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0b3JIZWxwZXIKLXsKLSAgcHJpdmF0ZSBHZW5lcmF0b3JIZWxwZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb252ZXJ0ZXIoCi0gICAgICBTdHJpbmcgcHJvcENsYXNzKQotICB7Ci0gICAgcmV0dXJuICgiamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXIiLmVxdWFscyhwcm9wQ2xhc3MpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tleVN0cm9rZSgKLSAgICAgIFN0cmluZyBwcm9wQ2xhc3MpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZheC5zd2luZy5LZXlTdHJva2UiLmVxdWFscyhwcm9wQ2xhc3MpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FXVEtleVN0cm9rZSgKLSAgICAgIFN0cmluZyBwcm9wQ2xhc3MpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZhLmF3dC5BV1RLZXlTdHJva2UiLmVxdWFscyhwcm9wQ2xhc3MpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bWJlcigKLSAgICAgIFN0cmluZyBwcm9wQ2xhc3MpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZhLmxhbmcuTnVtYmVyIi5lcXVhbHMocHJvcENsYXNzKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xvckxpc3QoCi0gICAgICBTdHJpbmcgcHJvcENsYXNzLAotICAgICAgU3RyaW5nW10gcHJvcENsYXNzUGFyYW1zKQotICB7Ci0gICAgcmV0dXJuICgiamF2YS51dGlsLkxpc3QiLmVxdWFscyhwcm9wQ2xhc3MpICYmCi0gICAgICAgIHByb3BDbGFzc1BhcmFtcy5sZW5ndGggPT0gMSAmJgotICAgICAgICAiamF2YS5hd3QuQ29sb3IiLmVxdWFscyhwcm9wQ2xhc3NQYXJhbXNbMF0pKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbG9yKAotICAgICAgU3RyaW5nIHByb3BDbGFzcykKLSAgewotICAgIHJldHVybiAoImphdmEuYXd0LkNvbG9yIi5lcXVhbHMocHJvcENsYXNzKSk7Ci0gIH0gIAotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGlvbihQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICByZXR1cm4gKHByb3BlcnR5LmdldENsYXNzKCkuZXF1YWxzKCJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIikKLSAgICAgICAgJiYgcHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkuZXF1YWxzKCJhY3Rpb24iKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3Rpb25MaXN0ZW5lcihQcm9wZXJ0eUJlYW4gcHJvcGVydHksIGJvb2xlYW4gaXMxMikKLSAgewotICAgIHJldHVybiAocHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkuZXF1YWxzKCJhY3Rpb25MaXN0ZW5lciIpICYmCi0gICAgICAgICgocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpIHx8IChpczEyICYmIHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKSkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsdWVDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUJlYW4gcHJvcGVydHksIGJvb2xlYW4gaXMxMikKLSAgewotICAgIHJldHVybiAocHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkuZXF1YWxzKCJ2YWx1ZUNoYW5nZUxpc3RlbmVyIikgJiYKLSAgICAgICAgKChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkgfHwgKGlzMTIgJiYgcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0b3IoUHJvcGVydHlCZWFuIHByb3BlcnR5LCBib29sZWFuIGlzMTIpCi0gIHsKLSAgICByZXR1cm4gKHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpLmVxdWFscygidmFsaWRhdG9yIikpICYmCi0gICAgICAgICgocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpIHx8IChpczEyICYmIHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKSk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIHZvaWQgd3JpdGVJbXBvcnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgIFNldCBpbXBvcnRzKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBpbXBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgaXRlcmF0b3IgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihpdGVyYXRvciwKLSAgICAgICAgbmV3IFBhY2thZ2VJbXBvcnRzRmlsdGVyKHBhY2thZ2VOYW1lKSk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgb3V0LnByaW50bG4oImltcG9ydCAiICsgY2xhc3NOYW1lICsgIjsiKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBQYWNrYWdlSW1wb3J0c0ZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotICB7Ci0gICAgcHVibGljIFBhY2thZ2VJbXBvcnRzRmlsdGVyKAotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgewotICAgICAgX3BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgICAgICBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBvYmplY3Q7Ci0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICByZXR1cm4gKCFwYWNrYWdlTmFtZS5lcXVhbHMoX3BhY2thZ2VOYW1lKSAmJgotICAgICAgICAgICFwYWNrYWdlTmFtZS5lcXVhbHMoImphdmEubGFuZyIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcGFja2FnZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKc3BQcm9wZXJ0eVR5cGUoUHJvcGVydHlCZWFuIHByb3BlcnR5LCBib29sZWFuIGlzMTIpCi0gIHsKLSAgICBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpCi0gICAgewotICAgICAgcmV0dXJuICJNZXRob2RFeHByZXNzaW9uIjsKLSAgICB9Ci0KLSAgICBpZiAoaXMxMiAmJiBwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIk1ldGhvZEV4cHJlc3Npb24iOwotICAgIH0KLQotICAgIGlmIChpczEyKQotICAgIHsKLSAgICAgIGlmICghcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gIlZhbHVlRXhwcmVzc2lvbiI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICJTdHJpbmciOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9BYnN0cmFjdENvbXBvbmVudEdlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvQWJzdHJhY3RDb21wb25lbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2OWZkMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9BYnN0cmFjdENvbXBvbmVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlByb3BlcnR5RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Tb3VyY2VUZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBvbmVudEdlbmVyYXRvciBpbXBsZW1lbnRzIENvbXBvbmVudEdlbmVyYXRvcgotewotCi0gIHByaXZhdGUgTG9nIF9sb2c7Ci0gIGJvb2xlYW4gX2lzMTI7Ci0KLSAgcHVibGljIEFic3RyYWN0Q29tcG9uZW50R2VuZXJhdG9yKExvZyBsb2csIGJvb2xlYW4gaXMxMikKLSAgewotICAgIF9sb2cgPSBsb2c7Ci0gICAgX2lzMTIgPSBpczEyOwotICB9Ci0KLSAgcHJvdGVjdGVkIExvZyBnZXRMb2coKQotICB7Ci0gICAgcmV0dXJuIF9sb2c7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUNsYXNzQmVnaW4oCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUpCi0gIHsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0KLSAgICAvLyBUT0RPOiByZXN0b3JlIGRlc2NyaXB0aW9uIChuZWVkcyBlc2NhcGluZz8pCi0vLyAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBjb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKTsKLS8vICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBvdXQucHJpbnRsbigiICoiKTsKLS8vICAgICAgb3V0LnByaW50bG4oIiAqICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotLy8gICAgfQotCi0gICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbiA9IGNvbXBvbmVudC5nZXRMb25nRGVzY3JpcHRpb24oKTsKLSAgICBpZiAobG9uZ0Rlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIik7Ci0gICAgICBvdXQucHJpbnRsbigiICogIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGxvbmdEZXNjcmlwdGlvbikpOwotICAgIH0KLQotICAgIGlmIChjb21wb25lbnQuaGFzRXZlbnRzKHRydWUpKQotICAgIHsKLSAgICAgIC8vIHRoZSBldmVudHMgamF2YWRvYwotICAgICAgb3V0LnByaW50bG4oIiAqIik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPGg0PkV2ZW50czo8L2g0PiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDx0YWJsZSBib3JkZXI9XCIxXCIgd2lkdGg9XCIxMDAlXCIgY2VsbHBhZGRpbmc9XCIzXCIgc3VtbWFyeT1cIlwiPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDx0ciBiZ2NvbG9yPVwiI0NDQ0NGRlwiIGNsYXNzPVwiVGFibGVIZWFkaW5nQ29sb3JcIj4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8dGggYWxpZ249XCJsZWZ0XCI+VHlwZTwvdGg+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHRoIGFsaWduPVwibGVmdFwiPlBoYXNlczwvdGg+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHRoIGFsaWduPVwibGVmdFwiPkRlc2NyaXB0aW9uPC90aD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8L3RyPiIpOwotICAgICAgSXRlcmF0b3IgZXZlbnRzID0gY29tcG9uZW50LmV2ZW50cyh0cnVlKTsKLSAgICAgIHdoaWxlIChldmVudHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKSBldmVudHMubmV4dCgpOwotICAgICAgICBFdmVudEJlYW4gZXZlbnQgPSBldmVudFJlZi5yZXNvbHZlRXZlbnRUeXBlKCk7Ci0gICAgICAgIGlmIChldmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGV2ZW50Q2xhc3MgPSBldmVudC5nZXRFdmVudENsYXNzKCk7Ci0gICAgICAgICAgU3RyaW5nW10gZXZlbnRQaGFzZXMgPSBldmVudFJlZi5nZXRFdmVudERlbGl2ZXJ5UGhhc2VzKCk7Ci0gICAgICAgICAgU3RyaW5nIGV2ZW50RGVzY3JpcHRpb24gPSBldmVudC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgKiA8dHIgY2xhc3M9XCJUYWJsZVJvd0NvbG9yXCI+Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAqIDx0ZCB2YWxpZ249XCJ0b3BcIj48Y29kZT4iICsgZXZlbnRDbGFzcyArICI8L2NvZGU+PC90ZD4iKTsKLSAgICAgICAgICBvdXQucHJpbnQoIiAqIDx0ZCB2YWxpZ249XCJ0b3BcIiBub3dyYXA+Iik7Ci0gICAgICAgICAgaWYgKGV2ZW50UGhhc2VzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudFBoYXNlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIG91dC5wcmludCgiPGJyPiIpOwotICAgICAgICAgICAgICBvdXQucHJpbnQoZXZlbnRQaGFzZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQucHJpbnRsbigiPC90ZD4iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICogPHRkIHZhbGlnbj1cInRvcFwiPiIgKyBldmVudERlc2NyaXB0aW9uICsgIjwvdGQ+Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAqIDwvdHI+Iik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCIgKiA8L3RhYmxlPiIpOwotICAgIH0KLQotICAgIGlmICghY29tcG9uZW50Lmhhc0NoaWxkcmVuKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIDxwPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIEl0IGRvZXMgbm90IHN1cHBvcnQgYW55IGNoaWxkcmVuLiIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIC8vIFRPRE86IGVsaW1pbmF0ZSA8bWZwOmNvbXBvbmVudC1jbGFzcy1tb2RpZmllcj4gbWV0YWRhdGEKLSAgICBpbnQgbW9kaWZpZXJzID0gY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzTW9kaWZpZXJzKCk7Ci0gICAgU3RyaW5nIGNsYXNzU3RhcnQgPSBNb2RpZmllci50b1N0cmluZyhtb2RpZmllcnMpOwotICAgIC8vIFRPRE86IHVzZSBjYW5vbmljYWwgb3JkZXJpbmcKLSAgICBjbGFzc1N0YXJ0ID0gY2xhc3NTdGFydC5yZXBsYWNlQWxsKCJwdWJsaWMgYWJzdHJhY3QiLCAiYWJzdHJhY3QgcHVibGljIik7Ci0gICAgb3V0LnByaW50bG4oY2xhc3NTdGFydCArICIgY2xhc3MgIiArIGNsYXNzTmFtZSArCi0gICAgICAgICIgZXh0ZW5kcyAiICsgc3VwZXJjbGFzc05hbWUpOwotCi0gICAgU2V0IGludGVyZmFjZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIGlmICh0ZW1wbGF0ZSAhPSBudWxsKQotICAgICAgaW50ZXJmYWNlcy5hZGRBbGwodGVtcGxhdGUuZ2V0SW1wbGVtZW50cygpKTsKLQotICAgIGlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50SW1wbGVtZW50cygpICE9IG51bGwpewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbXBvbmVudC5nZXRDb21wb25lbnRJbXBsZW1lbnRzKCksIiwiLGZhbHNlKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSl7Ci0gICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChzdC5uZXh0VG9rZW4oKSk7ICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbXBvbmVudC5pc05hbWluZ0NvbnRhaW5lcigpKQotICAgICAgaW50ZXJmYWNlcy5hZGQoImphdmF4LmZhY2VzLmNvbXBvbmVudC5OYW1pbmdDb250YWluZXIiKTsKLQotICAgIEl0ZXJhdG9yIGV2ZW50cyA9IGNvbXBvbmVudC5ldmVudHMoKTsKLSAgICB3aGlsZSAoZXZlbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKSBldmVudHMubmV4dCgpOwotICAgICAgRXZlbnRCZWFuIGV2ZW50ID0gZXZlbnRSZWYucmVzb2x2ZUV2ZW50VHlwZSgpOwotICAgICAgaWYgKGV2ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghZXZlbnRSZWYuaXNJZ25vcmVTb3VyY2VJbnRlcmZhY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzb3VyY2UgPSBldmVudC5nZXRFdmVudFNvdXJjZUludGVyZmFjZSgpOwotICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGludGVyZmFjZXMuYWRkKFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHNvdXJjZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFpbnRlcmZhY2VzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBTZXQgaW1wbGVtZW50c1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbnRlcmZhY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZjcW4gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgaW1wbGVtZW50c1NldC5hZGQoVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZmNxbikpOwotICAgICAgfQotCi0gICAgICAvLyBpbXBsZW1lbnRzIGNsYXVzZSBzcGFucyBtdWx0aXBsZSBsaW5lcwotICAgICAgY2hhcltdIGluZGVudCA9IG5ldyBjaGFyW2NsYXNzU3RhcnQubGVuZ3RoKCkgKwotICAgICAgICAgICIgY2xhc3MgIi5sZW5ndGgoKSArCi0gICAgICAgICAgY2xhc3NOYW1lLmxlbmd0aCgpICsgMV07Ci0gICAgICBBcnJheXMuZmlsbChpbmRlbnQsICcgJyk7Ci0gICAgICBvdXQucHJpbnQoaW5kZW50KTsKLSAgICAgIG91dC5wcmludCgiaW1wbGVtZW50cyAiKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGltcGxlbWVudHNTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBvdXQucHJpbnQoKFN0cmluZykgaXRlci5uZXh0KCkpOwotICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOwotICAgICAgICAgIG91dC5wcmludChpbmRlbnQpOwotICAgICAgICAgIG91dC5wcmludCgiICAgICAgICAgICAiKTsgIC8vIHNhbWUgbGVuZ3RoIGFzICJpbXBsZW1lbnRzICIKLSAgICAgICAgfQotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICAKLSAgICAvL1dyaXRlIHNlcmlhbFZlcnNpb25VSUQKLSAgICBpZiAoY29tcG9uZW50LmdldENvbXBvbmVudFNlcmlhbFVJRCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICEiIi5lcXVhbHMoY29tcG9uZW50LmdldENvbXBvbmVudFNlcmlhbFVJRCgpKSl7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAiKwotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRDb21wb25lbnRTZXJpYWxVSUQoKSsiOyIpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NFbmQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0KQotICB7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVJbXBvcnRzKFByZXR0eVdyaXRlciBvdXQsIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsIENvbGxlY3Rpb24gY29tcG9uZW50cykKLSAgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUltcG9ydHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUsCi0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lLAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICBTZXQgaW1wb3J0cyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICAvLyBVc2UgdGhlIHRlbXBsYXRlIGltcG9ydHMKLSAgICBpZiAodGVtcGxhdGUgIT0gbnVsbCkKLSAgICAgIGltcG9ydHMuYWRkQWxsKHRlbXBsYXRlLmdldEltcG9ydHMoKSk7Ci0KLSAgICBpZiAoY29tcG9uZW50LmdldENvbXBvbmVudEltcGxlbWVudHMoKSAhPSBudWxsKXsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb21wb25lbnQuZ2V0Q29tcG9uZW50SW1wbGVtZW50cygpLCIsIixmYWxzZSk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpewotICAgICAgICAgICAgaW1wb3J0cy5hZGQoc3QubmV4dFRva2VuKCkpOyAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgfSAgICAKLSAgICAKLSAgICAvLyBEZXRlY3QgTmFtaW5nQ29udGFpbmVyCi0gICAgaWYgKGNvbXBvbmVudC5pc05hbWluZ0NvbnRhaW5lcigpKQotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbXBvbmVudC5OYW1pbmdDb250YWluZXIiKTsKLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgTm9uVmlydHVhbEZpbHRlcigpKTsKLSAgICAvLyBQcm9wZXJ0eUtleSBvbmx5IG5lZWRlZCBpZiB0aGVyZSBhcmUgcHJvcGVydGllcwotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgICAgaWYgKHByb3BlcnR5Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGltcG9ydHMuYWRkKHByb3BlcnR5Q2xhc3MpOwotICAgICAgICAgIC8vIENoZWNrIGZvciBnZW5lcmljcwotICAgICAgICAgIFN0cmluZ1tdIHR5cGVzID0gcHJvcGVydHkuZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhZGRHZW5lcmljSW1wb3J0cyhpbXBvcnRzLCB0eXBlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgZmFjZXRzID0gY29tcG9uZW50LmZhY2V0cygpOwotICAgIC8vIFVJQ29tcG9uZW50IG5lZWRlZCBpZiB0aGVyZSBhcmUgZmFjZXRzCi0gICAgaWYgKGZhY2V0cy5oYXNOZXh0KCkpCi0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Iik7Ci0KLSAgICBJdGVyYXRvciBldmVudHMgPSBjb21wb25lbnQuZXZlbnRzKCk7Ci0gICAgd2hpbGUgKGV2ZW50cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXZlbnRSZWZCZWFuIGV2ZW50UmVmID0gKEV2ZW50UmVmQmVhbikgZXZlbnRzLm5leHQoKTsKLSAgICAgIEV2ZW50QmVhbiBldmVudCA9IGV2ZW50UmVmLnJlc29sdmVFdmVudFR5cGUoKTsKLQotICAgICAgaWYgKGV2ZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIlVua25vd24gZXZlbnQgdHlwZSBcIiIgKyBldmVudFJlZi5nZXRFdmVudFR5cGUoKSArICJcIiIgKwotICAgICAgICAgICAgIiBpbiBjb21wb25lbnQ6IiArIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgbGlzdGVuZXJDbGFzcyA9IGV2ZW50LmdldEV2ZW50TGlzdGVuZXJDbGFzcygpOwotICAgICAgICBpZiAobGlzdGVuZXJDbGFzcyAhPSBudWxsKQotICAgICAgICAgIGltcG9ydHMuYWRkKGxpc3RlbmVyQ2xhc3MpOwotCi0gICAgICAgIGlmICghZXZlbnRSZWYuaXNJZ25vcmVTb3VyY2VJbnRlcmZhY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzb3VyY2VJbnRlcmZhY2UgPSBldmVudC5nZXRFdmVudFNvdXJjZUludGVyZmFjZSgpOwotICAgICAgICAgIGlmIChzb3VyY2VJbnRlcmZhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGltcG9ydHMuYWRkKHNvdXJjZUludGVyZmFjZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbXBvcnQgY2F1c2VzIGEgY29sbGlzaW9uIGlmIGNsYXNzTmFtZSBhbmQgc3VwZXJjbGFzc05hbWUgYXJlIGVxdWFsCi0gICAgaWYgKCFzdXBlcmNsYXNzTmFtZS5lcXVhbHMoZnVsbFN1cGVyY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3VwZXJQYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoZnVsbFN1cGVyY2xhc3NOYW1lKTsKLSAgICAgIC8vIGNvbXBvbmVudCBzdXBlcmNsYXNzIG9ubHkgbmVlZGVkIGlmIG5vdCBpbgotICAgICAgLy8gc2FtZSBwYWNrYWdlIGFzIGNvbXBvbmVudCBjbGFzcwotICAgICAgaWYgKHN1cGVyUGFja2FnZU5hbWUgIT0gcGFja2FnZU5hbWUpCi0gICAgICAgIGltcG9ydHMuYWRkKGZ1bGxTdXBlcmNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLy8gYWRkIG90aGVyIGltcG9ydHMgKGdlbmVyYXRvciBzcGVjaWZpYykKLSAgICBhZGRTcGVjaWZpY0ltcG9ydHMoaW1wb3J0cywgY29tcG9uZW50KTsKLQotICAgIC8vIGRvIG5vdCBpbXBvcnQgaW1wbGljaXQgdHlwZXMhCi0gICAgaW1wb3J0cy5yZW1vdmVBbGwoVXRpbC5QUklNSVRJVkVfVFlQRVMpOwotCi0gICAgR2VuZXJhdG9ySGVscGVyLndyaXRlSW1wb3J0cyhvdXQsIHBhY2thZ2VOYW1lLCBpbXBvcnRzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmljSW1wb3J0cygKLSAgICAgIFNldCBpbXBvcnRzLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBub3RoaW5nIGJ5IGRlZmF1bHQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEdlbmVyaWNJbXBvcnRzKFNldCBpbXBvcnRzLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIE1hdGNoZXIgbWF0Y2hlciA9IF9HRU5FUklDX1RZUEUubWF0Y2hlcih0eXBlKTsKLSAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpCi0gICAgewotICAgICAgLy8gR2VuZXJpYyB0eXBlCi0gICAgICBpbXBvcnRzLmFkZChtYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgIFN0cmluZ1tdIHR5cGVzID0gbWF0Y2hlci5ncm91cCgyKS5zcGxpdCgiLCIpOwotICAgICAgZm9yIChpbnQgaSA9IHR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgewotICAgICAgICBhZGRHZW5lcmljSW1wb3J0cyhpbXBvcnRzLCB0eXBlc1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBOb24tZ2VuZXJpYyB0eXBlCi0gICAgICBpbXBvcnRzLmFkZCh0eXBlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUdlbmVyaWNDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSwKLSAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oInN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9GQU1JTFkgPSIpOwotICAgIG91dC5wcmludGxuKCIgIFwiIiArIGNvbXBvbmVudEZhbWlseSArICJcIjsiKTsKLSAgICBvdXQucHJpbnRsbigic3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1RZUEUgPSIpOwotICAgIG91dC5wcmludGxuKCIgIFwiIiArIGNvbXBvbmVudFR5cGUgKyAiXCI7Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5Q29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIG5vdGhpbmcKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlWYWx1ZUNvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAgY29tcG9uZW50IHByb3BlcnR5IGtleXMKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IE5vblZpcnR1YWxGaWx0ZXIoKSk7Ci0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgU3RyaW5nW10gcHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVZhbHVlcygpOwotCi0gICAgICBpZiAocHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eVZhbHVlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwcm9wVmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1tpXTsKLSAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlTmFtZSA9IHByb3BOYW1lICsKLSAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHByb3BWYWx1ZS5jaGFyQXQoMCkpICsKLSAgICAgICAgICAgICAgcHJvcFZhbHVlLnN1YnN0cmluZygxKTsKLSAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcFZhbHVlTmFtZSk7Ci0KLSAgICAgICAgICBvdXQucHJpbnRsbigic3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgIiArIHByb3BWYWx1ZUtleSArICIgPSBcIiIgKyBwcm9wVmFsdWUgKyAiXCI7Iik7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmFjZXRDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgZmFjZXRzID0gY29tcG9uZW50LmZhY2V0cygpOwotICAgIHdoaWxlIChmYWNldHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEZhY2V0QmVhbiBmYWNldCA9IChGYWNldEJlYW4pIGZhY2V0cy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgZmFjZXROYW1lID0gZmFjZXQuZ2V0RmFjZXROYW1lKCk7Ci0gICAgICBTdHJpbmcgZmFjZXRLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShmYWNldE5hbWUsICJfRkFDRVQiKTsKLSAgICAgIG91dC5wcmludGxuKCJzdGF0aWMgcHVibGljIGZpbmFsICIgKwotICAgICAgICAgICJTdHJpbmcgIiArIGZhY2V0S2V5ICsgIiA9IFwiIiArIGZhY2V0TmFtZSArICJcIjsiKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb0JveGVkTGl0ZXJhbCgKLSAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIlN0cmluZyIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJcIiIgKyB2YWx1ZS5yZXBsYWNlQWxsKCJcJyIsICJcXCciKSArICJcIiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJib29sZWFuIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gKCJ0cnVlIi5lcXVhbHModmFsdWUpKSA/ICJCb29sZWFuLlRSVUUiIDogIkJvb2xlYW4uRkFMU0UiOwotICAgIH0KLSAgICBlbHNlIGlmICgiY2hhciIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJDaGFyYWN0ZXIudmFsdWVPZignIiArIHZhbHVlLnJlcGxhY2VBbGwoIlwnIiwgIlxcJyIpICsgIicpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImludCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJJbnRlZ2VyLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkRvdWJsZS52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImZsb2F0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkZsb2F0LnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgiTnVtYmVyIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICBpZih2YWx1ZS5pbmRleE9mKCIuIikgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiSW50ZWdlci52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJEb3VibGUudmFsdWVPZigiICsgdmFsdWUgKyAiKSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwcm9wZXJ0eS1jbGFzcyAiICsgY2xhc3NOYW1lICsgIiBub3Qgc3VwcG9ydGVkIGZvciBhdXRvLWJveGluZyIpOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VmFyaWFibGVUb0JveGVkRm9ybSgKLSAgICBTdHJpbmcgIGNsYXNzTmFtZSwKLSAgICBTdHJpbmcgIHZhck5hbWUpCi0gIHsKLSAgICBpZiAoImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiB2YXJOYW1lICsgIiA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UiOwotICAgIH0KLSAgICBlbHNlIGlmICgiY2hhciIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJDaGFyYWN0ZXIudmFsdWVPZigiICsgdmFyTmFtZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImludCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJJbnRlZ2VyLnZhbHVlT2YoIiArIHZhck5hbWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJzaG9ydCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJTaG9ydC52YWx1ZU9mKCIgKyB2YXJOYW1lICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgibG9uZyIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJMb25nLnZhbHVlT2YoIiArIHZhck5hbWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiRG91YmxlLnZhbHVlT2YoIiArIHZhck5hbWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJGbG9hdC52YWx1ZU9mKCIgKyB2YXJOYW1lICsgIikiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicHJvcGVydHktY2xhc3MgIiArIGNsYXNzTmFtZSArICIgbm90IHN1cHBvcnRlZCBmb3IgYXV0by1ib3hpbmciKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUNvbnN0cnVjdG9yKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgaW50IG1vZGlmaWVycykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZnVsbENsYXNzTmFtZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpOwotICAgIFN0cmluZyBjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmdWxsQ2xhc3NOYW1lKTsKLQotICAgIGlmIChNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotICAgIHsKLSAgICAgIC8vIFRPRE86IGVsaW1pbmF0ZSB0aGlzIGluY29uc2lzdGVuY3kKLSAgICAgIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3NNb2RpZmllcnMoKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZW5kZXJlclR5cGUgPSBjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCk7Ci0KLSAgICAgICAgaWYgKHJlbmRlcmVyVHlwZSAhPSBudWxsKQotICAgICAgICAgIHJlbmRlcmVyVHlwZSA9IGNvbnZlcnRTdHJpbmdUb0JveGVkTGl0ZXJhbCgiU3RyaW5nIiwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgICAgIC8vIFRPRE86IHJlc3RvcmUgdGhpcyBjb3JyZWN0bHkgcGhyYXNlZCBjb21tZW50ICh0ZW5zZSB2cy4gY29tbWFuZCkKLSAgICAgICAgLy9vdXQucHJpbnRsbigiICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICAgICAgb3V0LnByaW50bG4oInB1YmxpYyAiICsgY2xhc3NOYW1lICsgIigpIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLQotICAgICAgICB3cml0ZUNvbnN0cnVjdG9yQ29udGVudChvdXQsIGNvbXBvbmVudCwgbW9kaWZpZXJzLCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgICAvLyBUT0RPOiByZXN0b3JlIHRoaXMgbW9yZSBkZXNjcmlwdGl2ZSBjb21tZW50IHdpdGggcGFyYW0gZG9jcwotICAgICAgLy9vdXQucHJpbnRsbigiICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSAiICsgY2xhc3NOYW1lKTsKLSAgICAgIC8vb3V0LnByaW50bG4oIiAqIHdpdGggdGhlIHNwZWNpZmllZCByZW5kZXJlciB0eXBlLiIpOwotICAgICAgLy9vdXQucHJpbnRsbigiICogIik7Ci0gICAgICAvL291dC5wcmludGxuKCIgKiBAcGFyYW0gcmVuZGVyZXJUeXBlICB0aGUgcmVuZGVyZXIgdHlwZSIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgICBvdXQucHJpbnRsbigicHJvdGVjdGVkICIgKyBjbGFzc05hbWUgKyAiKCIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyByZW5kZXJlclR5cGUiKTsKLSAgICAgIG91dC5wcmludGxuKCIpIik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICAgIHdyaXRlQ29uc3RydWN0b3JDb250ZW50KG91dCwgY29tcG9uZW50LCBtb2RpZmllcnMsICJyZW5kZXJlclR5cGUiKTsKLQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotCi0gICAgICAvLyBUT0RPOiBlbGltaW5hdGUgdGhpcyBpbmNvbnNpc3RlbmN5Ci0gICAgICBpZiAoTW9kaWZpZXIuaXNBYnN0cmFjdChjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3NNb2RpZmllcnMoKSkpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAgICAgLy8gVE9ETzogcmVzdG9yZSB0aGlzIGNvcnJlY3RseSBwaHJhc2VkIGNvbW1lbnQgKHRlbnNlIHZzLiBjb21tYW5kKQotICAgICAgICAvL291dC5wcmludGxuKCIgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgICAgICBvdXQucHJpbnRsbigiICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgICAgICBvdXQucHJpbnRsbigicHJvdGVjdGVkICIgKyBjbGFzc05hbWUgKyAiKCkiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigidGhpcyhudWxsKTsiKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVDb25zdHJ1Y3RvckNvbnRlbnQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICBpbnQgbW9kaWZpZXJzLCBTdHJpbmcgcmVuZGVyZXJUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVHZXRGYW1pbHkoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dC5wcmludGxuKCk7Ci0gICAgaWYgKF9pczEyKXsKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHVibGljIFN0cmluZyBnZXRGYW1pbHkoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gQ09NUE9ORU5UX0ZBTUlMWTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eU1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgd3JpdGVQcm9wZXJ0eU1ldGhvZHMob3V0LCBjb21wb25lbnQsIG51bGwpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5TWV0aG9kcyhQcmV0dHlXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwgQ29sbGVjdGlvbiBpZ25vcmVMaXN0KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IE5vblZpcnR1YWxGaWx0ZXIoKSk7Ci0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgaWYgKHByb3BlcnR5LmlzTGlzdCgpKQotICAgICAgICB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMob3V0LCBwcm9wZXJ0eSwgaWdub3JlTGlzdCk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbihvdXQsIHByb3BlcnR5KTsKLSAgICAgICAgd3JpdGVQcm9wZXJ0eUdldChvdXQsIHByb3BlcnR5LCBpZ25vcmVMaXN0KTsKLSAgICAgICAgd3JpdGVQcm9wZXJ0eVNldChvdXQsIHByb3BlcnR5LCBpZ25vcmVMaXN0KTsKLSAgICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKG91dCwgcHJvcGVydHksIGlnbm9yZUxpc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgIENvbGxlY3Rpb24gaW5vcmVMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nIGdldFNpbmd1bGFyKFN0cmluZyBwbHVyYWwpCi0gIHsKLSAgICBpZiAocGx1cmFsLmVuZHNXaXRoKCJzIikpCi0gICAgICByZXR1cm4gcGx1cmFsLnN1YnN0cmluZygwLCBwbHVyYWwubGVuZ3RoKCkgLSAxKTsKLSAgICByZXR1cm4gcGx1cmFsOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlTZXQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgQ29sbGVjdGlvbiBpZ25vcmVMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gVXRpbC5nZXRQcm9wZXJ0eUNsYXNzKHByb3BlcnR5KTsKLSAgICB3cml0ZVByb3BlcnR5U2V0KG91dCwgcHJvcGVydHksIHByb3BlcnR5Q2xhc3MsIGlnbm9yZUxpc3QpOwotCi0gICAgaWYgKHByb3BlcnR5LmdldEFsdGVybmF0ZUNsYXNzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYWx0ZXJuYXRlQ2xhc3MgPSBVdGlsLmdldEFsdGVybmF0ZVByb3BlcnR5Q2xhc3MocHJvcGVydHkpOwotICAgICAgd3JpdGVQcm9wZXJ0eVNldChvdXQsIHByb3BlcnR5LCBhbHRlcm5hdGVDbGFzcywgaWdub3JlTGlzdCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eVNldCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcywKLSAgICAgIENvbGxlY3Rpb24gaWdub3JlTGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgIGlmIChpZ25vcmVMaXN0ICE9IG51bGwgJiYgaWdub3JlTGlzdC5jb250YWlucyhzZXRNZXRob2QpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIFNldHMgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotCi0gICAgaWYgKHByb3BlcnR5LmlzUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHA+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogVGhpcyBpcyBhIHJlcXVpcmVkIHByb3BlcnR5IG9uIHRoZSBjb21wb25lbnQuIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCIgKiAiKTsKLSAgICBvdXQucHJpbnRsbigiICogQHBhcmFtICIgKyBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpICsgIiAgdGhlIG5ldyAiICsgcHJvcE5hbWUgKyAiIHZhbHVlIik7Ci0gICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICYmIF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiBAZGVwcmVjYXRlZCIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICBpZiAoaXNBY2Nlc3Nvck1ldGhvZEZpbmFsKCkpCi0gICAgewotICAgICAgb3V0LnByaW50KCJmaW5hbCAiKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIHNldE1ldGhvZCArICIoIiArIHByb3BlcnR5Q2xhc3MgKyAiICIgKyBwcm9wVmFyICsgIikiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICB3cml0ZVByb3BlcnR5U2V0dGVyTWV0aG9kQm9keShvdXQsIHByb3BlcnR5LCBwcm9wZXJ0eUNsYXNzKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVQcm9wZXJ0eVNldHRlck1ldGhvZEJvZHkoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5R2V0KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgIENvbGxlY3Rpb24gaWdub3JlTGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcGVydHlGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICBTdHJpbmcgZ2V0TWV0aG9kID0gVXRpbC5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkocHJvcE5hbWUsIHByb3BlcnR5Q2xhc3MpOwotICAgIGlmIChpZ25vcmVMaXN0ICE9IG51bGwgJiYgaWdub3JlTGlzdC5jb250YWlucyhnZXRNZXRob2QpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYm9vbGVhbiBpc1VuY2hlY2tlZCA9IGZhbHNlOwotICAgIFN0cmluZ1tdIGdlbmVyaWNUeXBlcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCk7Ci0gICAgaWYgKGdlbmVyaWNUeXBlcyAhPSBudWxsICYmIGdlbmVyaWNUeXBlcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGlzVW5jaGVja2VkID0gdHJ1ZTsKLSAgICAgIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldFByb3BlcnR5Q2xhc3MocHJvcGVydHkpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiBHZXRzICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgIH0KLSAgICBpZiAocHJvcGVydHkuaXNSZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8cD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiBUaGlzIGlzIGEgcmVxdWlyZWQgcHJvcGVydHkgb24gdGhlIGNvbXBvbmVudC4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8L3A+Iik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oIiAqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIEByZXR1cm4gIHRoZSBuZXcgIiArIHByb3BOYW1lICsgIiB2YWx1ZSIpOwotICAgIGlmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSAmJiBfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogQGRlcHJlY2F0ZWQiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgaWYgKGlzVW5jaGVja2VkKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKSIpOwotICAgIH0KLQotICAgIGlmIChpc0FjY2Vzc29yTWV0aG9kRmluYWwoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnQoImZpbmFsICIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgIiArIHByb3BlcnR5Q2xhc3MgKyAiICIgKyBnZXRNZXRob2QgKyAiKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIHdyaXRlUHJvcGVydHlHZXR0ZXJNZXRob2RCb2R5KG91dCwgcHJvcGVydHkpOwotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBnZXR0ZXJzL3NldHRlcnMgaGF2ZSB0aGUgZmluYWwgbW9kaWZpZXIKLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnZXR0ZXJzL3NldHRlcnMgYXJlIGZpbmFsCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjY2Vzc29yTWV0aG9kRmluYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVQcm9wZXJ0eUdldHRlck1ldGhvZEJvZHkoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVGYWNldE1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgZmFjZXRzID0gY29tcG9uZW50LmZhY2V0cygpOwotICAgIHdoaWxlIChmYWNldHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEZhY2V0QmVhbiBmYWNldCA9IChGYWNldEJlYW4pIGZhY2V0cy5uZXh0KCk7Ci0gICAgICB3cml0ZUZhY2V0R2V0KG91dCwgZmFjZXQpOwotICAgICAgd3JpdGVGYWNldFNldChvdXQsIGZhY2V0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUZhY2V0U2V0KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIEZhY2V0QmVhbiBmYWNldCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZmFjZXROYW1lID0gZmFjZXQuZ2V0RmFjZXROYW1lKCk7Ci0gICAgLy8gVE9ETzogZHJvcCB0aGUgdW5uZWNlc3NhcnkgIkZhY2V0IiBzdWZmaXgKLSAgICBTdHJpbmcgZmFjZXRWYXIgPSBmYWNldE5hbWUgKyAiRmFjZXQiOwotICAgIFN0cmluZyBmYWNldEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KGZhY2V0TmFtZSwgIl9GQUNFVCIpOwotICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBmYWNldE5hbWUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGZhY2V0LmdldERlc2NyaXB0aW9uKCk7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotICAgIGlmIChmYWNldC5pc1JlcXVpcmVkKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIDxwPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIFRoaXMgaXMgYSByZXF1aXJlZCBmYWNldCBvbiB0aGUgY29tcG9uZW50LiIpOwotICAgIH0KLSAgICAvLyBUT0RPOiBwdXQgdGhpcyBiYWNrIGluCi0gICAgLy9vdXQucHJpbnRsbigiICogIik7Ci0gICAgLy9vdXQucHJpbnRsbigiICogQHBhcmFtICIgKyBmYWNldFZhciArICIgIHRoZSBuZXcgIiArIGZhY2V0TmFtZSArICIgZmFjZXQiKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICAvLyBSZW1vdmUgdHlwZSBzYWZldHkgd2FybmluZyBzaW5jZSBnZXRGYWNldHMgaXMgbm90IGdlbmVyaWNzIGVuYWJsZWQKLSAgICAvLyB1bmRlciBKU0YgMS4xIHNwZWMKLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBsaW5lIHdoZW4gVHJpbmlkYWQgc3dpdGNoIHRvIEpTRiAxLjIKLSAgICBvdXQucHJpbnRsbigiQFN1cHByZXNzV2FybmluZ3MoXCJ1bmNoZWNrZWRcIikiKTsKLQotICAgIG91dC5wcmludGxuKCJmaW5hbCBwdWJsaWMgdm9pZCAiICsgc2V0TWV0aG9kICsgIihVSUNvbXBvbmVudCAiICsgZmFjZXRWYXIgKyAiKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJnZXRGYWNldHMoKS5wdXQoIiArIGZhY2V0S2V5ICsgIiwgIiArIGZhY2V0VmFyICsgIik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmFjZXRHZXQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgRmFjZXRCZWFuIGZhY2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBmYWNldE5hbWUgPSBmYWNldC5nZXRGYWNldE5hbWUoKTsKLSAgICBTdHJpbmcgZmFjZXRLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShmYWNldE5hbWUsICJfRkFDRVQiKTsKLSAgICBTdHJpbmcgZ2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiZ2V0IiwgZmFjZXROYW1lKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBmYWNldC5nZXREZXNjcmlwdGlvbigpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgIH0KLSAgICBpZiAoZmFjZXQuaXNSZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8cD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiBUaGlzIGlzIGEgcmVxdWlyZWQgZmFjZXQgb24gdGhlIGNvbXBvbmVudC4iKTsKLSAgICB9Ci0gICAgLy8gVE9ETzogcHV0IHRoaXMgYmFjayBpbgotICAgIC8vb3V0LnByaW50bG4oIiAqICIpOwotICAgIC8vb3V0LnByaW50bG4oIiAqIEByZXR1cm4gIHRoZSAiICsgZmFjZXROYW1lICsgIiBmYWNldCIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIG91dC5wcmludGxuKCJmaW5hbCBwdWJsaWMgVUlDb21wb25lbnQgIiArIGdldE1ldGhvZCArICIoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gZ2V0RmFjZXQoIiArIGZhY2V0S2V5ICsgIik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlTGlzdGVuZXJNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIGV2ZW50cyA9IGNvbXBvbmVudC5ldmVudHMoKTsKLSAgICB3aGlsZSAoZXZlbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKSBldmVudHMubmV4dCgpOwotICAgICAgRXZlbnRCZWFuIGV2ZW50ID0gZXZlbnRSZWYucmVzb2x2ZUV2ZW50VHlwZSgpOwotICAgICAgaWYgKGV2ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHdyaXRlTGlzdGVuZXJBZGQob3V0LCBldmVudCk7Ci0gICAgICAgIHdyaXRlTGlzdGVuZXJSZW1vdmUob3V0LCBldmVudCk7Ci0gICAgICAgIHdyaXRlTGlzdGVuZXJzR2V0KG91dCwgZXZlbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlTGlzdGVuZXJBZGQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgRXZlbnRCZWFuIGV2ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBsaXN0ZW5lckZ1bGxDbGFzcyA9IGV2ZW50LmdldEV2ZW50TGlzdGVuZXJDbGFzcygpOwotICAgIFN0cmluZyBsaXN0ZW5lckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MobGlzdGVuZXJGdWxsQ2xhc3MpOwotCi0gICAgU3RyaW5nIGV2ZW50TmFtZSA9IGV2ZW50LmdldEV2ZW50TmFtZSgpOwotICAgIFN0cmluZyBhZGRNZXRob2QgPSBVdGlsLmdldE1ldGhvZE5hbWVGcm9tRXZlbnQoImFkZCIsIGV2ZW50TmFtZSwgIkxpc3RlbmVyIik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBvdXQucHJpbnRsbigiICogQWRkcyBhICIgKyBldmVudE5hbWUgKyAiIGxpc3RlbmVyLiIpOwotICAgIG91dC5wcmludGxuKCIgKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBAcGFyYW0gbGlzdGVuZXIgIHRoZSAiICsgZXZlbnROYW1lICsgIiBsaXN0ZW5lciB0byBhZGQiKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICBpZiAoaXNBY2Nlc3Nvck1ldGhvZEZpbmFsKCkpCi0gICAgewotICAgICAgb3V0LnByaW50KCJmaW5hbCAiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyBhZGRNZXRob2QgKyAiKCIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbihsaXN0ZW5lckNsYXNzICsgIiBsaXN0ZW5lcikiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigiYWRkRmFjZXNMaXN0ZW5lcihsaXN0ZW5lcik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlTGlzdGVuZXJSZW1vdmUoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgRXZlbnRCZWFuIGV2ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBsaXN0ZW5lckZ1bGxDbGFzcyA9IGV2ZW50LmdldEV2ZW50TGlzdGVuZXJDbGFzcygpOwotICAgIFN0cmluZyBsaXN0ZW5lckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MobGlzdGVuZXJGdWxsQ2xhc3MpOwotCi0gICAgU3RyaW5nIGV2ZW50TmFtZSA9IGV2ZW50LmdldEV2ZW50TmFtZSgpOwotICAgIFN0cmluZyByZW1vdmVNZXRob2QgPSBVdGlsLmdldE1ldGhvZE5hbWVGcm9tRXZlbnQoInJlbW92ZSIsIGV2ZW50TmFtZSwgIkxpc3RlbmVyIik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBvdXQucHJpbnRsbigiICogUmVtb3ZlcyBhICIgKyBldmVudE5hbWUgKyAiIGxpc3RlbmVyLiIpOwotICAgIG91dC5wcmludGxuKCIgKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBAcGFyYW0gbGlzdGVuZXIgIHRoZSAiICsgZXZlbnROYW1lICsgIiBsaXN0ZW5lciB0byByZW1vdmUiKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICBpZiAoaXNBY2Nlc3Nvck1ldGhvZEZpbmFsKCkpCi0gICAgewotICAgICAgb3V0LnByaW50KCJmaW5hbCAiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyByZW1vdmVNZXRob2QgKyAiKCIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbihsaXN0ZW5lckNsYXNzICsgIiBsaXN0ZW5lcikiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmVtb3ZlRmFjZXNMaXN0ZW5lcihsaXN0ZW5lcik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlTGlzdGVuZXJzR2V0KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIEV2ZW50QmVhbiBldmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbGlzdGVuZXJGdWxsQ2xhc3MgPSBldmVudC5nZXRFdmVudExpc3RlbmVyQ2xhc3MoKTsKLSAgICBTdHJpbmcgbGlzdGVuZXJDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGxpc3RlbmVyRnVsbENsYXNzKTsKLQotICAgIFN0cmluZyBldmVudE5hbWUgPSBldmVudC5nZXRFdmVudE5hbWUoKTsKLSAgICBTdHJpbmcgZ2V0TWV0aG9kID0gVXRpbC5nZXRNZXRob2ROYW1lRnJvbUV2ZW50KCJnZXQiLCBldmVudE5hbWUsICJMaXN0ZW5lcnMiKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGF0dGFjaGVkICIgKyBldmVudE5hbWUgKyAiIGxpc3RlbmVycy4iKTsKLSAgICBvdXQucHJpbnRsbigiICoiKTsKLSAgICBvdXQucHJpbnRsbigiICogQHJldHVybiAgYW4gYXJyYXkgb2YgYXR0YWNoZWQgIiArIGV2ZW50TmFtZSArICIgbGlzdGVuZXJzLiIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIGlmIChpc0FjY2Vzc29yTWV0aG9kRmluYWwoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnQoImZpbmFsICIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHVibGljICIgKyBsaXN0ZW5lckNsYXNzICsgIltdICIgKyBnZXRNZXRob2QgKyAiKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuICgiICsgbGlzdGVuZXJDbGFzcyArICJbXSkiICsKLSAgICAgICAgImdldEZhY2VzTGlzdGVuZXJzKCIgKyBsaXN0ZW5lckNsYXNzICsgIi5jbGFzcyk7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTdGF0ZU1hbmFnZW1lbnRNZXRob2RzKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHB1YmxpYyB2b2lkIHdyaXRlT3RoZXIoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBub3RoaW5nCi0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KAotICAgICAgU3RyaW5nIGNvbW1lbnRCb2R5KQotICB7Ci0gICAgcmV0dXJuIGNvbW1lbnRCb2R5LnJlcGxhY2VBbGwoIlxuIiwgIlxuICogIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgUmVzb2x2YWJsZVR5cGVGaWx0ZXIgZXh0ZW5kcyBQcm9wZXJ0eUZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gICAgewotICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICBTdHJpbmcgcmVzb2x2YWJsZVR5cGUgPSByZXNvbHZlVHlwZShwcm9wZXJ0eUNsYXNzKTsKLSAgICAgIHJldHVybiAocmVzb2x2YWJsZVR5cGUgIT0gbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIE5vblZpcnR1YWxGaWx0ZXIgZXh0ZW5kcyBQcm9wZXJ0eUZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuICghcHJvcGVydHkuaXNWaXJ0dWFsKCkpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVUeXBlKAotICAgICAgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKSBfUkVTT0xWQUJMRV9UWVBFUy5nZXQoY2xhc3NOYW1lKTsKLSAgfQotCi0KLSAgc3RhdGljIHByaXZhdGUgTWFwIF9jcmVhdGVSZXNvbHZhYmxlVHlwZXMoKQotICB7Ci0gICAgTWFwIHJlc29sdmFibGVUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJib29sZWFuIiwgIkJvb2xlYW4iKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJjaGFyIiwgIkNoYXJhY3RlciIpOwotICAgIC8vIFRPRE86IHB1dCB0aGlzIGJhY2sgaW4KLSAgICAvL3Jlc29sdmFibGVUeXBlcy5wdXQoImphdmEudXRpbC5EYXRlIiwgIkRhdGUiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJpbnQiLCAiSW50ZWdlciIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImZsb2F0IiwgIkZsb2F0Iik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiZG91YmxlIiwgIkRvdWJsZSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEudXRpbC5Mb2NhbGUiLCAiTG9jYWxlIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgibG9uZyIsICJMb25nIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS5sYW5nLlN0cmluZyIsICJTdHJpbmciKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLmxhbmcuTnVtYmVyIiwgIk51bWJlciIpOwotICAgIC8vIFRPRE86IHB1dCB0aGlzIGJhY2sgaW4KLSAgICAvL3Jlc29sdmFibGVUeXBlcy5wdXQoImphdmEubGFuZy5TdHJpbmdbXSIsICJTdHJpbmdBcnJheSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEudXRpbC5UaW1lWm9uZSIsICJUaW1lWm9uZSIpOwotCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXNvbHZhYmxlVHlwZXMpOwotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgUGF0dGVybiBfR0VORVJJQ19UWVBFID0gUGF0dGVybi5jb21waWxlKCIoW148XSspPCguKyk+Iik7Ci0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIE1hcCBfUkVTT0xWQUJMRV9UWVBFUyA9IF9jcmVhdGVSZXNvbHZhYmxlVHlwZXMoKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L0NvbXBvbmVudEdlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvQ29tcG9uZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlY2E3OTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvQ29tcG9uZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkNsYXNzR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvbXBvbmVudCBjbGFzc2VzCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEdlbmVyYXRvciBleHRlbmRzIENsYXNzR2VuZXJhdG9yCi17Ci0KLSAgdm9pZCB3cml0ZUdlbmVyaWNDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSwKLSAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVByb3BlcnR5Q29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVByb3BlcnR5VmFsdWVDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlRmFjZXRDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlR2V0RmFtaWx5KAotICAgICAgUHJldHR5V3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVQcm9wZXJ0eU1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlRmFjZXRNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZUxpc3RlbmVyTWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVTdGF0ZU1hbmFnZW1lbnRNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZU90aGVyKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCi0gIHZvaWQgd3JpdGVQcm9wZXJ0eU1ldGhvZHMoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGlnbm9yZUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L015RmFjZXNDb21wb25lbnRHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L015RmFjZXNDb21wb25lbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViNTA2Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9NeUZhY2VzQ29tcG9uZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5HZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBDb21wb25lbnQgZ2VuZXJhdG9yIGZvciBNeUZhY2VzCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgTXlGYWNlc0NvbXBvbmVudEdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50R2VuZXJhdG9yCi17Ci0KLSAgcHVibGljIE15RmFjZXNDb21wb25lbnRHZW5lcmF0b3IoTG9nIGxvZywgYm9vbGVhbiBpczEyKQotICB7Ci0gICAgc3VwZXIobG9nLCBpczEyKTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWNJbXBvcnRzKFNldCBpbXBvcnRzLCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dCIpOwotICAgIGlmIChfaXMxMil7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICB9ZWxzZXsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGxJdGVyYXRvciA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7IGxJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBsUHJvcGVydHlCZWFuID0gKFByb3BlcnR5QmVhbikgbEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IobFByb3BlcnR5QmVhbiwgX2lzMTIpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciIpOwotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YS51dGlsLkFycmF5TGlzdCIpOwotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YS51dGlsLkxpc3QiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIGZpZWxkUHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wZXJ0eUZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5RnVsbENsYXNzKTsKLSAgICBTdHJpbmcgcHJvcGVydHlHZW5lcmljcyA9IFV0aWwuZ2V0R2VuZXJpY3NGcm9tUHJvcGVydHkocHJvcGVydHkpOwotICAgIFN0cmluZyBkZWYgPSBVdGlsLmdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eSk7Ci0gICAgCi0gICAgaWYgKHByb3BlcnR5Q2xhc3MuZW5kc1dpdGgoIkJvb2xlYW4iKSl7Ci0gICAgICAgIGRlZiA9ICJCb29sZWFuLnZhbHVlT2YoIitkZWYrIikiOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8vIFByb3BlcnR5OiAiICsgcHJvcE5hbWUpOwotICAgIGlmIChwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkgfHwgcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKXsKLSAgICAgICAgLy9JZiB0aGUgcHJvcGVydHkgaXMgbGl0ZXJhbCBvciBpcyB0YWdBdHRyaWJ1dGVFeGNsdWRlZCwgCi0gICAgICAgIC8vdGhlIGRlZmF1bHQgdmFsdWUgZ29lcyBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZmllbGQKLSAgICAgICAgb3V0LnByaW50bG4oInByaXZhdGUgIiArIHByb3BlcnR5Q2xhc3MgKyBwcm9wZXJ0eUdlbmVyaWNzICsgIiAiICsKLSAgICAgICAgICAgICAgICBmaWVsZFByb3BOYW1lICsgKGRlZiA9PSBudWxsID8gIjsiIDogIiA9ICIgKyBkZWYgKyAiOyIpKTsgICAgICAgIAotICAgIH1lbHNleyAgICAgICAgCi0gICAgICAgIC8vSWYgaXMgYSBwcmltaXRpdmUgY2xhc3MsIGhhcyBhIHNldCBmaWVsZCB0byBjaGVjayBpZiB0aGlzCi0gICAgICAgIC8vcHJvcGVydHkgaXMgZGVmaW5lZCwgc28gdGhlIGRlZmF1bHQgdmFsdWUgZ29lcyBvbiB0aGUgCi0gICAgICAgIC8vZ2V0dGVyIG1ldGhvZC4KLSAgICAgICAgLy9JZiBpcyBhIGNsYXNzLCB0aGUgc2FtZSBhcHBsaWVzLCBiZWNhdXNlIHRoZSBjaGVjawotICAgICAgICAvL2lzIGFnYWluc3QgbnVsbAotICAgICAgICBvdXQucHJpbnRsbigicHJpdmF0ZSAiICsgcHJvcGVydHlDbGFzcyArIHByb3BlcnR5R2VuZXJpY3MgKyAiICIgKwotICAgICAgICAgICAgICAgIGZpZWxkUHJvcE5hbWUgKyAiOyIpOyAgICAgICAgCi0gICAgfQotCi0gICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcykgJiYgIXByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigicHJpdmF0ZSBib29sZWFuICIgKyBmaWVsZFByb3BOYW1lICsgIlNldDsiKTsKLSAgICAgIAotICAgICAgaWYgKHByb3BlcnR5LmlzSXNTZXRNZXRob2QoKSl7Ci0gICAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgICBTdHJpbmcgc2NvcGUgPSBwcm9wZXJ0eS5nZXRJc1NldE1ldGhvZFNjb3BlKCk7Ci0gICAgICAgICAgaWYgKHNjb3BlID09IG51bGwpIHNjb3BlID0gInByb3RlY3RlZCI7Ci0gICAgICAgICAgb3V0LnByaW50bG4oc2NvcGUrIiBib29sZWFuICIrVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNTZXQiLCBwcm9wTmFtZSkgKyAiKCkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBmaWVsZFByb3BOYW1lICsgIlNldDsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAocHJvcGVydHkuaXNJc0dldExvY2FsTWV0aG9kKCkpewotICAgICAgICBTdHJpbmcgbWV0aG9kUHJlZml4ID0gKCJib29sZWFuIi5lcXVhbHMocHJvcGVydHlDbGFzcykgPyAiaXNMb2NhbCIgOiAiZ2V0TG9jYWwiKTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKG1ldGhvZFByZWZpeCwgcHJvcE5hbWUpOwotICAgICAgICAKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgU3RyaW5nIHNjb3BlID0gcHJvcGVydHkuZ2V0SXNHZXRMb2NhbE1ldGhvZFNjb3BlKCk7Ci0gICAgICAgIGlmIChzY29wZSA9PSBudWxsKSBzY29wZSA9ICJwcm90ZWN0ZWQiOwotICAgICAgICAKLSAgICAgICAgb3V0LnByaW50bG4oImZpbmFsICIrc2NvcGUrIiAiICsgcHJvcGVydHlDbGFzcyArICIgIiArIG1ldGhvZE5hbWUgKyAiKCkiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBmaWVsZFByb3BOYW1lICsgIjsiKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgICAgICAgCi0gICAgfSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlU3RhdGVNYW5hZ2VtZW50TWV0aG9kcyhQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFjb21wb25lbnQuaGFzUHJvcGVydGllcygpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3cml0ZVNhdmVTdGF0ZShvdXQsIGNvbXBvbmVudCk7Ci0gICAgd3JpdGVSZXN0b3JlU3RhdGUob3V0LCBjb21wb25lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBub3RoaW5nCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbnN0cnVjdG9yQ29udGVudChQcmV0dHlXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwgaW50IG1vZGlmaWVycywgU3RyaW5nIHJlbmRlcmVyVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQucHJpbnRsbigic2V0UmVuZGVyZXJUeXBlKCIgKyByZW5kZXJlclR5cGUgKyAiKTsiKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcyhQcmV0dHlXcml0ZXIgb3V0LCBQcm9wZXJ0eUJlYW4gcHJvcGVydHksIENvbGxlY3Rpb24gaWdub3JlTGlzdCkKLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBnZW5lcmljOwotICAgIFN0cmluZyB0eXBlOwotICAgIGJvb2xlYW4gaXNWYWxpZGF0b3IgPSBHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IocHJvcGVydHksIF9pczEyKTsKLSAgICBpZiAoaXNWYWxpZGF0b3IpCi0gICAgewotICAgICAgZ2VuZXJpYyA9ICI8VmFsaWRhdG9yPiI7Ci0gICAgICB0eXBlID0gIlZhbGlkYXRvciI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIGdlbmVyaWMgPSBVdGlsLmdldEdlbmVyaWNzRnJvbVByb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgIHR5cGUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eS5nZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKVswXSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbmx5IG9uZSBHZW5lcmljIFBhcmFtZXRlciBpcyBhbGxvd2VkIGZvciBMaXN0cyIpOwotICAgIH0KLQotICAgIFN0cmluZyBzaW5ndWxhck5hbWUgPSBnZXRTaW5ndWxhcihwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUoc2luZ3VsYXJOYW1lKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotICAgIFN0cmluZyBhZGRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJhZGQiLCBzaW5ndWxhck5hbWUpOwotICAgIFN0cmluZyByZW1vdmVNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJyZW1vdmUiLCBzaW5ndWxhck5hbWUpOwotICAgIFN0cmluZyBnZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJnZXQiLCBzaW5ndWxhck5hbWUgKyAicyIpOwotICAgIFN0cmluZyBmaWVsZFByb3BOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKSArIChpc1ZhbGlkYXRvciA/ICJMaXN0IiA6ICIiKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8vIFByb3BlcnR5OiAiICsgcHJvcE5hbWUpOwotICAgIG91dC5wcmludGxuKCJwcml2YXRlIExpc3QiICsgZ2VuZXJpYyArICIgIiArIGZpZWxkUHJvcE5hbWUgKyAiOyIpOwotICAgIGlmIChpZ25vcmVMaXN0ID09IG51bGwgfHwgIWlnbm9yZUxpc3QuY29udGFpbnMoYWRkTWV0aG9kKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCIgKiBBZGRzIGEgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIGFkZE1ldGhvZCArICIoICIgKyB0eXBlICsgIiAiICsKLSAgICAgICAgICBwcm9wVmFyICsgIikiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oXCIiICsgcHJvcFZhciArICJcIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBmaWVsZFByb3BOYW1lICsgIiA9PSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oIiAgIiArIGZpZWxkUHJvcE5hbWUgKyAiID0gbmV3IEFycmF5TGlzdCIgKyBnZW5lcmljICsgIigpOyIpOwotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKGZpZWxkUHJvcE5hbWUgKyAiLmFkZCgiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLQotICAgIGlmIChpZ25vcmVMaXN0ID09IG51bGwgfHwgIWlnbm9yZUxpc3QuY29udGFpbnMocmVtb3ZlTWV0aG9kKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCIgKiBSZW1vdmVzIGEgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIHJlbW92ZU1ldGhvZCArICIoICIgKyB0eXBlICsgIiAiICsgcHJvcFZhciArICIpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgPT0gbnVsbCB8fCAiICsgZmllbGRQcm9wTmFtZSArICIgPT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCIgIHJldHVybjsiKTsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbihmaWVsZFByb3BOYW1lICsgIi5yZW1vdmUoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0KLSAgICBpZiAoaWdub3JlTGlzdCA9PSBudWxsIHx8ICFpZ25vcmVMaXN0LmNvbnRhaW5zKGdldE1ldGhvZCkpCi0gICAgewotICAgICAgaWYgKGlzVmFsaWRhdG9yKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicHJpdmF0ZSBzdGF0aWMgZmluYWwgIiArIHR5cGUgKyAiW10gRU1QVFlfIiArIHR5cGUudG9VcHBlckNhc2UoKSArICJfQVJSQVkgPSBuZXcgIiArIHR5cGUgKyAiWzBdOyIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiICogR2V0cyBhbGwgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgICBpZiAoaXNWYWxpZGF0b3IpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgIiArIHR5cGUgKyAiW10gIiArIGdldE1ldGhvZCArICIoKSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicHVibGljIExpc3QiICsgZ2VuZXJpYyArICIgIiArIGdldE1ldGhvZCArICIoKSIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIGlmIChpc1ZhbGlkYXRvcikKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgZmllbGRQcm9wTmFtZSArICI9PSBudWxsPyBFTVBUWV8iICsgdHlwZS50b1VwcGVyQ2FzZSgpICsgIl9BUlJBWSA6ICIgKyBmaWVsZFByb3BOYW1lICsgIi50b0FycmF5KG5ldyAiICsgdHlwZSArICJbIiArIGZpZWxkUHJvcE5hbWUgKyAiLnNpemUoKV0pOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBmaWVsZFByb3BOYW1lICsgIiA9PSBudWxsKSIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKGZpZWxkUHJvcE5hbWUgKyAiID0gbmV3IEFycmF5TGlzdDwiICsgdHlwZSArICI+KCk7Iik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBmaWVsZFByb3BOYW1lICsgIjsiKTsKLSAgICAgIH0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5U2V0dGVyTWV0aG9kQm9keShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB2YXJOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLSAgICBvdXQucHJpbnRsbigidGhpcy4iICsgdmFyTmFtZSArICIgPSAiICsgcHJvcFZhciArICI7Iik7Ci0KLSAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5Q2xhc3MpICYmICFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInRoaXMuIiArIF9wcmltaXRpdmVTZXRWYXJOYW1lKHZhck5hbWUpICsgIiA9IHRydWU7Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eUdldHRlck1ldGhvZEJvZHkoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB2YXJOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgaWYgKHByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpICsgIjsiKTsKLSAgICB9Ci0gICAgZWxzZSBpZihwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgdmFyTmFtZSArICI7Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BGdWxsQ2xhc3MpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBfcHJpbWl0aXZlU2V0VmFyTmFtZSh2YXJOYW1lKSArICIpIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHZhck5hbWUgKyAiICE9IG51bGwpIik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKSArICI7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBpZiAoX2lzMTIpewotICAgICAgICAgIG91dC5wcmludGxuKCJWYWx1ZUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGdldFZhbHVlRXhwcmVzc2lvbihcIiIgKyBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSArICJcIik7Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImlmIChleHByZXNzaW9uICE9IG51bGwpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgX2Nhc3RJZk5lY2Vzc2FyeShwcm9wQ2xhc3MpICsgImV4cHJlc3Npb24uZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGdldFZhbHVlQmluZGluZyhcIiIgKyBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSArICJcIik7Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImlmICh2YiAhPSBudWxsKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcEZ1bGxDbGFzcykpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gKCIgKyBfY2FzdElmTmVjZXNzYXJ5KHByb3BDbGFzcykgKyAidmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkpKS4iK3Byb3BDbGFzcysiVmFsdWUoKTsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBudWxsOyAKLSAgICAgICAgICAgICAgaWYgKCAodHlwZSA9IFV0aWwuZ2V0UHJpbWl0aXZlVHlwZShwcm9wQ2xhc3MpKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiT2JqZWN0IHZhbHVlID0gdmIgPT0gbnVsbCA/IG51bGwgOiB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKSk7Iik7Ci0gICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiaWYgKCEodmFsdWUgaW5zdGFuY2VvZiAiK3Byb3BDbGFzcysiKSl7Iik7Ci0gICAgICAgICAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigidmFsdWUgPSAiICsgVXRpbC5nZXRCb3hlZENsYXNzKHR5cGUpICsiLnZhbHVlT2YodmFsdWUudG9TdHJpbmcoKSk7Iik7Ci0gICAgICAgICAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBfY2FzdElmTmVjZXNzYXJ5KHByb3BDbGFzcykgKyAidmFsdWU7Iik7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBfY2FzdElmTmVjZXNzYXJ5KHByb3BDbGFzcykgKyAidmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkpOyIpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7ICAgICAgICAgIAotICAgICAgfQotCi0gICAgICBTdHJpbmcgcmV0ID0gVXRpbC5nZXREZWZhdWx0VmFsdWUocHJvcGVydHkpOwotICAgICAgaWYgKG51bGwgIT0gcmV0KQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyByZXQgKyAiOyIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BGdWxsQ2xhc3MpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBVdGlsLnByaW1pdGl2ZURlZmF1bHRWYWx1ZShwcm9wRnVsbENsYXNzKSArICI7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gbnVsbDsiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNhdmVTdGF0ZShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYXJyYXlOYW1lID0gInZhbHVlcyI7Ci0KLSAgICAvLyBmaXJzdCB3ZSBjb3VudCB0aGUgcHJpbWl0aXZlIHByb3BlcnRpZXMsIGJlY2F1c2UgZm9yIGVhY2ggcHJpbWl0aXZlIHByb3BlcnR5Ci0gICAgLy8gd2Ugc2F2ZSBhIG5ldyBwcm9wZXJ0eSB0aGF0IHNheXMgaWYgdGhlIHByb3BlcnR5IGhhcyBiZWVuIHNldCBvciBub3QKLSAgICBpbnQgcHJpbWl0aXZlUHJvcGVydGllc0NvdW50ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpCi0gICAgICB7Ci0gICAgICAgIHByaW1pdGl2ZVByb3BlcnRpZXNDb3VudCsrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHRoZSB0b3RhbCBhcnJheSBzaXplIGlzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcywgcGx1cyB0aGUgbnVtYmVyIG9mIHByaW1pdGl2ZXMsCi0gICAgLy8gcGx1cyAxICh0aGUgc3VwZXIgY2FsbCkKLSAgICBpbnQgYXJyYXlTaXplID0gY29tcG9uZW50LnByb3BlcnRpZXNTaXplKCkgKyBwcmltaXRpdmVQcm9wZXJ0aWVzQ291bnQgKyAxOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBpZiAoX2lzMTIpewotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgT2JqZWN0IHNhdmVTdGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJPYmplY3RbXSAiICsgYXJyYXlOYW1lICsgIiA9IG5ldyBPYmplY3RbIiArIGFycmF5U2l6ZSArICJdOyIpOwotCi0gICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgMCArICJdID0gc3VwZXIuc2F2ZVN0YXRlKGZhY2VzQ29udGV4dCk7Iik7Ci0KLSAgICBpbnQgcHJvcEluZGV4ID0gMTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wb25lbnQucHJvcGVydGllcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyB2YXJOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLQotICAgICAgaWYgKHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgKytwcm9wSW5kZXggKyAiXSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIiArIHZhck5hbWUgKyAiTGlzdCk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNMaXN0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyArK3Byb3BJbmRleCArICJdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiICsgdmFyTmFtZSArICIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiICsgdmFyTmFtZSArICIpOyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb252ZXJ0ZXIocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIgKyB2YXJOYW1lICsgIik7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghX2lzMTIgJiYgVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpewotICAgICAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0gPSAiK1V0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKyIudmFsdWVPZigiICsgdmFyTmFtZSArICIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0gPSAiICsgdmFyTmFtZSArICI7Iik7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotCi0gICAgICBwcm9wSW5kZXgrKzsKLQotICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpICYmICFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghX2lzMTIpewotICAgICAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0gPSBCb29sZWFuLnZhbHVlT2YoIiArIF9wcmltaXRpdmVTZXRWYXJOYW1lKHZhck5hbWUpICsgIik7Iik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0gPSAiICsgX3ByaW1pdGl2ZVNldFZhck5hbWUodmFyTmFtZSkgKyAiOyIpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BJbmRleCsrOwotICAgICAgfQotICAgIH0KLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiAiICsgYXJyYXlOYW1lICsgIjsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVSZXN0b3JlU3RhdGUoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGFycmF5TmFtZSA9ICJ2YWx1ZXMiOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBpZiAoX2lzMTIpewotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IHN0YXRlKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgb3V0LnByaW50bG4oIk9iamVjdFtdICIgKyBhcnJheU5hbWUgKyAiID0gKE9iamVjdFtdKXN0YXRlOyIpOwotICAgIG91dC5wcmludGxuKCJzdXBlci5yZXN0b3JlU3RhdGUoZmFjZXNDb250ZXh0LCIgKyBhcnJheU5hbWUgKyAiWzBdKTsiKTsKLQotICAgIGludCBwcm9wSW5kZXggPSAxOwotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICBTdHJpbmcgdmFyTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0gICAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLQotICAgICAgaWYgKHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4odmFyTmFtZSArICJMaXN0ID0gKExpc3Q8VmFsaWRhdG9yPikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiCi0gICAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgKytwcm9wSW5kZXggKyAiXSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNMaXN0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbih2YXJOYW1lICsgIiA9IChMaXN0KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIKLSAgICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyArK3Byb3BJbmRleCArICJdKTsiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbih2YXJOYW1lICsgIiA9ICIgKyBfY2FzdElmTmVjZXNzYXJ5KHByb3BDbGFzcykgKyAicmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiCi0gICAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0pOyIpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbnZlcnRlcihwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbih2YXJOYW1lICsgIiA9IChDb252ZXJ0ZXIpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIgotICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghX2lzMTIgJiYgVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpewotICAgICAgICAgICAgb3V0LnByaW50bG4odmFyTmFtZSArICIgPSAoIiArIF9jYXN0SWZOZWNlc3NhcnkocHJvcENsYXNzKQotICAgICAgICAgICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdKS4iK3Byb3BDbGFzcysiVmFsdWUoKTsiKTsgICAgICAgICAgICAKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbih2YXJOYW1lICsgIiA9ICIgKyBfY2FzdElmTmVjZXNzYXJ5KHByb3BDbGFzcykKLSAgICAgICAgICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXTsiKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcm9wSW5kZXgrKzsKLQotICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpICYmICFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghX2lzMTIpewotICAgICAgICAgICAgb3V0LnByaW50bG4oX3ByaW1pdGl2ZVNldFZhck5hbWUodmFyTmFtZSkgKyAiID0gKChCb29sZWFuKSIKLSAgICAgICAgICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSkuYm9vbGVhblZhbHVlKCk7Iik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgb3V0LnByaW50bG4oX3ByaW1pdGl2ZVNldFZhck5hbWUodmFyTmFtZSkgKyAiID0gKEJvb2xlYW4pIgotICAgICAgICAgICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdOyIpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BJbmRleCsrOwotICAgICAgfQotICAgIH0KLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2Nhc3RJZk5lY2Vzc2FyeShTdHJpbmcgcHJvcENsYXNzKQotICB7Ci0gICAgaWYgKHByb3BDbGFzcy5lcXVhbHMoIk9iamVjdCIpIHx8IHByb3BDbGFzcy5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wQ2xhc3MpKQotICAgIHsKLSAgICAgIHByb3BDbGFzcyA9IFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wQ2xhc3MpOwotICAgIH0KLQotICAgIHJldHVybiAiKCIgKyBwcm9wQ2xhc3MgKyAiKSI7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX3ByaW1pdGl2ZVNldFZhck5hbWUoU3RyaW5nIHZhck5hbWUpCi0gIHsKLSAgICByZXR1cm4gdmFyTmFtZSArICJTZXQiOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEdlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1ZDI3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Qcm9wZXJ0eUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50R2VuZXJhdG9yCi17Ci0gIHB1YmxpYyBUcmluaWRhZENvbXBvbmVudEdlbmVyYXRvcihMb2cgbG9nLCBib29sZWFuIGlzMTIpCi0gIHsKLSAgICBzdXBlcihsb2csIGlzMTIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWNJbXBvcnRzKFNldCBpbXBvcnRzLCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIC8vIEZhY2VzQmVhbiBpcyBhbHdheXMgbmVlZGVkIHRvIGRlZmluZSB0aGUgVFlQRQotCi0gICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5iZWFuLkZhY2VzQmVhbiIpOwotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBOb25WaXJ0dWFsRmlsdGVyKCkpOwotICAgIC8vIFByb3BlcnR5S2V5IG9ubHkgbmVlZGVkIGlmIHRoZXJlIGFyZSBwcm9wZXJ0aWVzCi0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuYmVhbi5Qcm9wZXJ0eUtleSIpOwotCi0gICAgICBQcm9wZXJ0eUZpbHRlciByZXNvbHZhYmxlID0gbmV3IFJlc29sdmFibGVUeXBlRmlsdGVyKCk7Ci0gICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotCi0gICAgICAgIC8vIENvbXBvbmVudFV0aWxzIG9ubHkgbmVlZGVkIGZvciByZXNvbHZhYmxlIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKHJlc29sdmFibGUuYWNjZXB0KHByb3BlcnR5KSkKLSAgICAgICAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnV0aWwuQ29tcG9uZW50VXRpbHMiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbnN0cnVjdG9yQ29udGVudChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQucHJpbnRsbigic3VwZXIoIiArIHJlbmRlcmVyVHlwZSArICIpOyIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKFByZXR0eVdyaXRlciBvdXQsIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwgQ29sbGVjdGlvbiBnbm9yZUxpc3QpCi0gIHsKLSAgICAvLyBub3RoaW5nCi0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5Q29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dC5wcmludGxuKCJzdGF0aWMgcHVibGljIGZpbmFsIEZhY2VzQmVhbi5UeXBlIFRZUEUgPSBuZXcgRmFjZXNCZWFuLlR5cGUoIik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKHN1cGVyY2xhc3NOYW1lICsgIi5UWVBFKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLQotICAgIC8vICBjb21wb25lbnQgcHJvcGVydHkga2V5cwotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgTm9uVmlydHVhbEZpbHRlcigpKTsKLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgICBTdHJpbmcgcHJvcEFsaWFzID0gcHJvcGVydHkuZ2V0QWxpYXNPZigpOwotCi0gICAgICBvdXQucHJpbnRsbigic3RhdGljIHB1YmxpYyBmaW5hbCBQcm9wZXJ0eUtleSAiICsgcHJvcEtleSArICIgPSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgaWYgKHByb3BBbGlhcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgYWxpYXNLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wQWxpYXMsICJfS0VZIik7Ci0gICAgICAgIG91dC5wcmludCgiVFlQRS5yZWdpc3RlckFsaWFzKCIgKyBhbGlhc0tleSArICIsIFwiIiArIHByb3BOYW1lICsgIlwiKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJUWVBFLnJlZ2lzdGVyS2V5KFwiIiArIHByb3BOYW1lICsgIlwiIik7Ci0KLSAgICAgICAgLy8gcHJvcGVydHkgY2xhc3MKLSAgICAgICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICAgICAgaWYgKHByb3BDbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvcENsYXNzID0gIlN0cmluZyI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHByb3BEZWZhdWx0ID0gcHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKCEiT2JqZWN0Ii5lcXVhbHMocHJvcENsYXNzKSB8fCBwcm9wRGVmYXVsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gVE9ETzogZG8gbm90IHVzZSBib3hlZCBjbGFzcyBoZXJlCi0gICAgICAgICAgU3RyaW5nIGJveGVkQ2xhc3MgPSBVdGlsLmdldEJveGVkQ2xhc3MocHJvcENsYXNzKTsKLSAgICAgICAgICBvdXQucHJpbnQoIiwgIiArIGJveGVkQ2xhc3MgKyAiLmNsYXNzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcERlZmF1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwcm9wZXJ0eS5pc0VudW0oKSkKLSAgICAgICAgICAgIG91dC5wcmludCgiLCBFbnVtLnZhbHVlT2YoIiArIHByb3BDbGFzcyArICIuY2xhc3MsIiArCi0gICAgICAgICAgICAgICAgICAgICAgY29udmVydFN0cmluZ1RvQm94ZWRMaXRlcmFsKCJTdHJpbmciLCBwcm9wRGVmYXVsdCkgKwotICAgICAgICAgICAgICAgICAgICAgICIpIik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LnByaW50KCIsICIgKyBjb252ZXJ0U3RyaW5nVG9Cb3hlZExpdGVyYWwocHJvcENsYXNzLCBwcm9wRGVmYXVsdCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJvcGVydHkgY2FwYWJpbGl0aWVzCi0gICAgICAgIFN0cmluZyBwcm9wQ2FwcyA9IF9nZXRQcm9wZXJ0eUNhcGFiaWxpdGllcyhwcm9wZXJ0eSk7Ci0gICAgICAgIGlmIChwcm9wQ2FwcyAhPSBudWxsKQotICAgICAgICAgIG91dC5wcmludCgiLCAiICsgcHJvcENhcHMpOwotICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKLSAgICAgIH0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbihQcmV0dHlXcml0ZXIgb3V0LCBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gbm90aGluZyBieSBkZWZhdWx0Ci0gIH0KLQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBnZXR0ZXJzL3NldHRlcnMgaGF2ZSB0aGUgZmluYWwgbW9kaWZpZXIKLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnZXR0ZXJzL3NldHRlcnMgYXJlIGZpbmFsCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjY2Vzc29yTWV0aG9kRmluYWwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5U2V0dGVyTWV0aG9kQm9keShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotCi0gICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eUNsYXNzKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigic2V0UHJvcGVydHkoIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgIGNvbnZlcnRWYXJpYWJsZVRvQm94ZWRGb3JtKHByb3BlcnR5Q2xhc3MsIHByb3BWYXIpICsKLSAgICAgICAgICAgICAgICAgICIpOyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInNldFByb3BlcnR5KCIgKyBwcm9wS2V5ICsgIiwgKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlHZXR0ZXJNZXRob2RCb2R5KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcGVydHlGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLQotICAgIFN0cmluZyByZXNvbHZhYmxlVHlwZSA9IHJlc29sdmVUeXBlKHByb3BlcnR5RnVsbENsYXNzKTsKLQotICAgIGlmIChyZXNvbHZhYmxlVHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRPRE86IGNoYW5nZSBzaWduYXR1cmUgb2YgQ29tcG9uZW50VXRpbHMucmVzb2x2ZUNoYXJhY3RlcgotICAgICAgLy8gICAgICAgdG8gdGFrZSBPYmplY3QgaW5zdGVhZCBvZiBDaGFyYWN0ZXIKLSAgICAgIGlmIChyZXNvbHZhYmxlVHlwZS5lcXVhbHMoIkNoYXJhY3RlciIpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuIENvbXBvbmVudFV0aWxzLnJlc29sdmVDaGFyYWN0ZXIoKENoYXJhY3RlcilnZXRQcm9wZXJ0eSgiICsgcHJvcEtleSArICIpKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogc3RvcCBzcGVjaWZ5aW5nIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBnZXR0ZXJzCi0gICAgICAgIFN0cmluZyByZXNvbHZlTWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgicmVzb2x2ZSIsIHJlc29sdmFibGVUeXBlKTsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5RGVmYXVsdCA9IHByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICBvdXQucHJpbnQoInJldHVybiBDb21wb25lbnRVdGlscy4iICsgcmVzb2x2ZU1ldGhvZCArICIoZ2V0UHJvcGVydHkoIiArIHByb3BLZXkgKyAiKSIpOwotICAgICAgICBpZiAocHJvcGVydHlEZWZhdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnQoIiwgIiArIFV0aWwuY29udmVydFN0cmluZ1RvTGl0ZXJhbChwcm9wZXJ0eUNsYXNzLAotICAgICAgICAgICAgICBwcm9wZXJ0eURlZmF1bHQpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwcm9wZXJ0eUNsYXNzLmVxdWFscygiT2JqZWN0IikpCi0gICAgICB7Ci0gICAgICAgIC8vIENhc3QgaXMgbm90IG5lY2Vzc2FyeSBpZiB0aGUgcHJvcGVydHkgY2xhc3MgaXMgT2JqZWN0Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gZ2V0UHJvcGVydHkoIiArIHByb3BLZXkgKyAiKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAoIiArIHByb3BlcnR5Q2xhc3MgKyAiKSIgKwotICAgICAgICAgICAgImdldFByb3BlcnR5KCIgKyBwcm9wS2V5ICsgIik7Iik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVTdGF0ZU1hbmFnZW1lbnRNZXRob2RzKFByZXR0eVdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIGlmICghImphdmEudXRpbC5MaXN0Ii5lcXVhbHMocHJvcGVydHlDbGFzcykpCi0gICAgewotICAgICAgZ2V0TG9nKCkuZXJyb3IoIkludmFsaWQgbGlzdCB0eXBlOiAiICsgcHJvcGVydHlDbGFzcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTG9vayBmb3IgdGhlIGdlbmVyaWMgdHlwZSAtIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4KLSAgICAvLyB3ZSdsbCBiZSBhbiBPYmplY3QuCi0gICAgU3RyaW5nW10gcGFyYW1zID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzc1BhcmFtZXRlcnMoKTsKLSAgICBpZiAoKHBhcmFtcyA9PSBudWxsKSB8fCAocGFyYW1zLmxlbmd0aCA9PSAwKSkKLSAgICAgIHByb3BlcnR5Q2xhc3MgPSAiamF2YS5sYW5nLk9iamVjdCI7Ci0gICAgZWxzZQotICAgICAgcHJvcGVydHlDbGFzcyA9IHBhcmFtc1swXTsKLQotICAgIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eUNsYXNzKTsKLQotICAgIFN0cmluZyBzaW5ndWxhck5hbWUgPSBnZXRTaW5ndWxhcihwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUoc2luZ3VsYXJOYW1lKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotICAgIFN0cmluZyBhZGRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJhZGQiLCBzaW5ndWxhck5hbWUpOwotICAgIFN0cmluZyByZW1vdmVNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJyZW1vdmUiLCBzaW5ndWxhck5hbWUpOwotICAgIFN0cmluZyBnZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJnZXQiLCBwcm9wTmFtZSk7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogQWRkcyBhICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgb3V0LnByaW50bG4oImZpbmFsIHB1YmxpYyB2b2lkICIgKyBhZGRNZXRob2QgKyAiKCIgKyBwcm9wZXJ0eUNsYXNzICsgIiAiICsKLSAgICAgICAgcHJvcFZhciArICIpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgPT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigiICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiKTsKLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJnZXRGYWNlc0JlYW4oKS5hZGRFbnRyeSgiICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiBSZW1vdmVzIGEgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICBvdXQucHJpbnRsbigiZmluYWwgcHVibGljIHZvaWQgIiArIHJlbW92ZU1ldGhvZCArICIoIiArIHByb3BlcnR5Q2xhc3MgKyAiICIgKwotICAgICAgICBwcm9wVmFyICsgIikiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiA9PSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyIpOwotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oImdldEZhY2VzQmVhbigpLnJlbW92ZUVudHJ5KCIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIEdldHMgYWxsICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgb3V0LnByaW50bG4oImZpbmFsIHB1YmxpYyAiICsgcHJvcGVydHlDbGFzcyArICJbXSAiICsgZ2V0TWV0aG9kICsgIigpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiAoIiArIHByb3BlcnR5Q2xhc3MgKyAiW10pIGdldEZhY2VzQmVhbigpLmdldEVudHJpZXMoIik7Ci0gICAgb3V0LnByaW50bG4oIiAgICAgICAgICIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BlcnR5Q2xhc3MgKyAiLmNsYXNzKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVPdGhlcihQcmV0dHlXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBfd3JpdGVHZXRCZWFuVHlwZShvdXQpOwotCi0gICAgd3JpdGVDb25zdHJ1Y3RvcihvdXQsIGNvbXBvbmVudCwgTW9kaWZpZXIuUFJPVEVDVEVEKTsKLQotICAgIF93cml0ZVR5cGVMb2NrKG91dCwgY29tcG9uZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIF93cml0ZUdldEJlYW5UeXBlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICBvdXQucHJpbnRsbigicHJvdGVjdGVkIEZhY2VzQmVhbi5UeXBlIGdldEJlYW5UeXBlKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuIFRZUEU7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUeXBlTG9jaygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oInN0YXRpYyIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIFN0cmluZyByZW5kZXJlclR5cGUgPSBjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCk7Ci0gICAgaWYgKHJlbmRlcmVyVHlwZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJUWVBFLmxvY2soKTsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkgPSBjb21wb25lbnQuZmluZENvbXBvbmVudEZhbWlseSgpOwotICAgICAgb3V0LnByaW50bG4oIlRZUEUubG9ja0FuZFJlZ2lzdGVyKFwiIiArIGNvbXBvbmVudEZhbWlseSArICJcIiwiICsKLSAgICAgICAgICAiXCIiICsgcmVuZGVyZXJUeXBlICsgIlwiKTsiKTsKLSAgICB9Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dldFByb3BlcnR5Q2FwYWJpbGl0aWVzKAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgTGlzdCBjYXBzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpIHx8Ci0gICAgICAgIHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSAgICB7Ci0gICAgICBjYXBzLmFkZCgiUHJvcGVydHlLZXkuQ0FQX05PVF9CT1VORCIpOwotICAgIH0KLQotICAgIGlmIChwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkpCi0gICAgewotICAgICAgY2Fwcy5hZGQoIlByb3BlcnR5S2V5LkNBUF9TVEFURV9IT0xERVIiKTsKLSAgICB9Ci0KLSAgICBpZiAocHJvcGVydHkuaXNUcmFuc2llbnQoKSkKLSAgICB7Ci0gICAgICBjYXBzLmFkZCgiUHJvcGVydHlLZXkuQ0FQX1RSQU5TSUVOVCIpOwotICAgIH0KLQotICAgIGlmIChwcm9wZXJ0eS5pc0xpc3QoKSkKLSAgICB7Ci0gICAgICBjYXBzLmFkZCgiUHJvcGVydHlLZXkuQ0FQX0xJU1QiKTsKLSAgICB9Ci0KLSAgICBpZiAoY2Fwcy5pc0VtcHR5KCkpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgPiAwKQotICAgICAgICBzYi5hcHBlbmQoIiB8ICIpOwotICAgICAgc2IuYXBwZW5kKGNhcHMuZ2V0KGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0Q29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdENvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYThkYjgzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0Q29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5HZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Tb3VyY2VUZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogVE9ETzogY29tbWVudCB0aGlzIQotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcG9uZW50VGFnR2VuZXJhdG9yIGltcGxlbWVudHMgQ29tcG9uZW50VGFnR2VuZXJhdG9yCi17Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVJbXBvcnRzKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIENvbGxlY3Rpb24gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKLSAgICB3cml0ZUltcG9ydHMob3V0LCB0ZW1wbGF0ZSwgcGFja2FnZU5hbWUsIGZ1bGxTdXBlcmNsYXNzTmFtZSwgc3VwZXJjbGFzc05hbWUsIGNvbXBvbmVudHMpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUltcG9ydHMoUHJldHR5V3JpdGVyIG91dCwgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwgQ29sbGVjdGlvbiBjb21wb25lbnRzKQotICB7Ci0gICAgU2V0IGltcG9ydHMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgZm9yIChJdGVyYXRvciBsSXRlcmF0b3IgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGxJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pIGxJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotCi0gICAgICAvLyBUT0RPOiByZW1vdmUgdGhlc2UgaW1wb3J0cwotICAgICAgLy8gRklYTUU6IEFjdHVhbGx5IGxhc3QgMiBjYW4gYmUga2VwdCB3aGVuIG5vdCBhYnN0cmFjdAotICAgICAgLy9pbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Iik7Ci0KLSAgICAgIC8vIHN1cGVyY2xhc3NOYW1lIGlzIGZ1bGx5IHF1YWxpZmllZCBpZiBpdCBjb2xsaWRlcwotICAgICAgLy8gd2l0aCB0aGUgZ2VuZXJhdGVkIGNsYXNzIG5hbWUgYW5kIHNob3VsZCBub3QgYmUKLSAgICAgIC8vIGltcG9ydGVkIHdoZW4gc3VjaCBhIGNvbGxpc2lvbiB3b3VsZCBvY2N1cgotICAgICAgaWYgKCFzdXBlcmNsYXNzTmFtZS5lcXVhbHMoZnVsbFN1cGVyY2xhc3NOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoZnVsbFN1cGVyY2xhc3NOYW1lKTsKLSAgICAgIH0KLQotICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLQotICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgICAgU3RyaW5nW10gcHJvcGVydHlDbGFzc1BhcmFtcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5Q2xhc3MgIT0gbnVsbCAmJiBwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJbXBvcnQgdGhlIHByb3BlcnR5IGNsYXNzIG9ubHkgaWYgb25seSBsaXR0ZXJhbHMgYXJlIHN1cHBvcnRlZAotICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgY2xhc3Mgd2lsbCBiZSBhIFN0cmluZyBpbnNpZGUgdGhlIHRhZyB0byBzdXBwb3J0Ci0gICAgICAgICAgLy8gVmFsdWVCaW5kaW5nCi0gICAgICAgICAgaW1wb3J0cy5hZGQocHJvcGVydHlDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiByZXN0b3JlIGltcG9ydCBhbmQgbWFrZSByZWZlcmVuY2UgdG8KLSAgICAgICAgLy8gICAgICAgQ29uc3RhbnRNZXRob2RCaW5kaW5nIHJlbGF0aXZlIHJhdGhlcgotICAgICAgICAvLyAgICAgICB0aGFuIGFic29sdXRlCi0gICAgICAgIC8vaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICYmCi0gICAgICAgIC8vICAgIGlzU3RyaW5nTWV0aG9kQmluZGluZ1JldHVyblR5cGUocHJvcGVydHkpKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIuQ29uc3RhbnRNZXRob2RCaW5kaW5nIik7Ci0gICAgICAgIC8vfQotICAgICAgfQotCi0gICAgICBhZGRTcGVjaWZpY0ltcG9ydHMoaW1wb3J0cywgY29tcG9uZW50KTsKLQotICAgIH0KLSAgICAvLyBkbyBub3QgaW1wb3J0IGltcGxpY2l0IQotICAgIGltcG9ydHMucmVtb3ZlQWxsKFV0aWwuUFJJTUlUSVZFX1RZUEVTKTsKLQotICAgIEdlbmVyYXRvckhlbHBlci53cml0ZUltcG9ydHMob3V0LCBwYWNrYWdlTmFtZSwgaW1wb3J0cyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUNsYXNzQmVnaW4oUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlKQotICB7Ci0gICAgaW50IG1vZGlmaWVycyA9IGNvbXBvbmVudC5nZXRUYWdDbGFzc01vZGlmaWVycygpOwotICAgIFN0cmluZyBjbGFzc1N0YXJ0ID0gTW9kaWZpZXIudG9TdHJpbmcobW9kaWZpZXJzKTsKLQotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBvdXQucHJpbnRsbigiICogQXV0by1nZW5lcmF0ZWQgdGFnIGNsYXNzLiIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIC8vIFRPRE86IHVzZSBjYW5vbmljYWwgb3JkZXJpbmcKLSAgICBjbGFzc1N0YXJ0ID0gY2xhc3NTdGFydC5yZXBsYWNlQWxsKCJwdWJsaWMgYWJzdHJhY3QiLCAiYWJzdHJhY3QgcHVibGljIik7Ci0gICAgb3V0LnByaW50bG4oY2xhc3NTdGFydCArICIgY2xhc3MgIiArIGNsYXNzTmFtZSArCi0gICAgICAgICIgZXh0ZW5kcyAiICsgc3VwZXJjbGFzc05hbWUpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUNvbnN0cnVjdG9yKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVycykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZnVsbENsYXNzTmFtZSA9IGNvbXBvbmVudC5nZXRUYWdDbGFzcygpOwotICAgIFN0cmluZyBjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmdWxsQ2xhc3NOYW1lKTsKLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAvLyBUT0RPOiByZXN0b3JlIHRoaXMgY29ycmVjdGx5IHBocmFzZWQgY29tbWVudCAodGVuc2UgdnMuIGNvbW1hbmQpCi0gICAgLy9vdXQucHJpbnRsbigiICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICBvdXQucHJpbnRsbigiICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyAiICsgY2xhc3NOYW1lICsgIigpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVHZXRDb21wb25lbnRUeXBlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKLSAgICBvdXQucHJpbnRsbigpOwotCi0gICAgLy8gVGhlIHN1cGVyY2xhc3MgZG9lcyBub3QgbmVjZXNzYXJpbHkgbmVlZCB0byBoYXZlIHRoaXMgbWV0aG9kCi0gICAgLy9vdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiBcIiIgKyBjb21wb25lbnRUeXBlICsgIlwiOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUdldFJlbmRlcmVyVHlwZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlID0gY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpOwotICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICAvLyBUaGUgc3VwZXJjbGFzcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBuZWVkIHRvIGhhdmUgdGhpcyBtZXRob2QKLSAgICAvL291dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICBvdXQucHJpbnRsbigicHVibGljIFN0cmluZyBnZXRSZW5kZXJlclR5cGUoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIFV0aWwuY29udmVydFN0cmluZ1RvTGl0ZXJhbChyZW5kZXJlclR5cGUpICsgIjsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVDbGFzc0VuZChQcmV0dHlXcml0ZXIgb3V0KQotICB7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlNZW1iZXJzKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotCi0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKG91dCwgcHJvcGVydHkpOwotICAgICAgd3JpdGVQcm9wZXJ0eVNldHRlcihvdXQsIHByb3BlcnR5KTsKLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlNZW1iZXJzKFByZXR0eVdyaXRlciBvdXQsIENvbGxlY3Rpb24gY29tcG9uZW50cykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGxJdGVyYXRvciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgbEl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgd3JpdGVQcm9wZXJ0eU1lbWJlcnMob3V0LCAoQ29tcG9uZW50QmVhbikgbEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVSZWxlYXNlTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgIGNvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0gICAgd3JpdGVSZWxlYXNlTWV0aG9kKG91dCwgY29tcG9uZW50cyk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUmVsZWFzZU1ldGhvZCgKLSAgICBQcmV0dHlXcml0ZXIgb3V0LCBDb2xsZWN0aW9uIGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgQ29sbGVjdGlvbiBhbGwgPSBuZXcgSGFzaFNldCgpOwotICAgIGJvb2xlYW4gc3BlY2lhbCA9IGZhbHNlOwotICAgIGZvciAoSXRlcmF0b3IgbEl0ZXJhdG9yID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBsSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKSBsSXRlcmF0b3IubmV4dCgpOwotICAgICAgSXRlcmF0b3IgcHJvcCA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgICAvLyBUT0RPOiByZW1vdmUgc3BlY2lhbCBjYXNlIGZvciBVSVhGb3JtVGFnCi0gICAgICBzcGVjaWFsIHw9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIuVUlYRm9ybVRhZyIuZXF1YWxzKGNvbXBvbmVudC5nZXRUYWdDbGFzcygpKTsKLSAgICAgIHdoaWxlIChwcm9wLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgYWxsLmFkZChwcm9wLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGFsbC5pdGVyYXRvcigpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSB8fCBzcGVjaWFsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBpZiAoaXMxMigpKXsKLSAgICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgcmVsZWFzZSgpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInN1cGVyLnJlbGVhc2UoKTsiKTsKLSAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotICAgICAgICBvdXQucHJpbnQocHJvcFZhciArICIgPSAiKTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBHZW5lcmF0b3JIZWxwZXIuZ2V0SnNwUHJvcGVydHlUeXBlKHByb3BlcnR5LCBpczEyKCkpOwotICAgICAgICAvLyBGSVhNRTogc3VwcG9ydCBhbGwgcHJpbWl0aXZlIHR5cGVzLiAgSW4gcHJhY3RpY2UsIHRoZSBvbmx5IHR5cGVzCi0gICAgICAgIC8vIHRoYXQgaGF2ZSBjb21lIHVwIGFyZSBWYWx1ZUV4cHJlc3Npb24sIFN0cmluZywgYW5kIGJvb2xlYW4KLSAgICAgICAgaWYgKCJib29sZWFuIi5lcXVhbHModHlwZSkpCi0gICAgICAgICAgb3V0LnByaW50bG4oImZhbHNlOyIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgb3V0LnByaW50bG4oIm51bGw7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWNJbXBvcnRzKAotICAgICAgU2V0IGltcG9ydHMsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIC8vIG5vdGhpbmcgYnkgZGVmYXVsdAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGJlaW5nIHVzZWQgZm9yIGdlbmVyYXRpbmcgSlNGIDEuMiBjb2RlLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXMxMigpOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVQcm9wZXJ0eVNldHRlcihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlU2V0UHJvcGVydHlNZXRob2RCb2R5KFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgcHJvcGVydGllcykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MzZmOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5BYnN0cmFjdFRhZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db252ZXJ0ZXJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRhZ0dlbmVyYXRvciB7Ci0gIHByb3RlY3RlZCBBYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIsIFN0cmluZyBsaWNlbnNlSGVhZGVyLCBMb2cgbG9nKSB7Ci0gICAgc3VwZXIoaXMxMiwgbGljZW5zZUhlYWRlciwgbG9nKTsKLSAgfQotCi0gICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVRhZ0hhbmRsZXIoCi0gICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIsIEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpbmcgIiArIGNvbnZlcnRlci5nZXRUYWdDbGFzcygpKTsKLQotICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgUHJldHR5V3JpdGVyIG91dCA9IG5ldyBQcmV0dHlXcml0ZXIoc3cpOwotCi0gICAgICBTZXQgaW1wb3J0cyA9IGNyZWF0ZUltcG9ydHMoY29udmVydGVyKTsKLSAgICAgIHdyaXRlSGVhZGVyKG91dCwgY29udmVydGVyLCBpbXBvcnRzKTsKLQotICAgICAgd3JpdGVDbGFzcyhvdXQsIGNvbnZlcnRlcik7Ci0KLSAgICAgIHdyaXRlQ29uc3RydWN0b3Iob3V0LCBjb252ZXJ0ZXIpOwotCi0gICAgICB3cml0ZVByb3BlcnR5TWV0aG9kcyhvdXQsIGNvbnZlcnRlcik7Ci0gICAgICB3cml0ZURvU3RhcnRUYWcob3V0LCBjb252ZXJ0ZXIpOwotICAgICAgd3JpdGVDcmVhdGVDb252ZXJ0ZXIob3V0LCBjb252ZXJ0ZXIpOwotICAgICAgd3JpdGVTZXRQcm9wZXJ0aWVzKG91dCwgY29udmVydGVyKTsKLSAgICAgIHdyaXRlUmVsZWFzZShvdXQsIGNvbnZlcnRlcik7Ci0KLSAgICAgIHdyaXRlRW5kKG91dCk7Ci0gICAgICAvLyBkZWxheSB3cml0ZSBpbiBjYXNlIG9mIGVycm9yCi0gICAgICAvLyB0aW1lc3RhbXAgc2hvdWxkIG5vdCBiZSB1cGRhdGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICAvLyBkZWxldGUgdGFyZ2V0IGZpbGUgZmlyc3QsIGJlY2F1c2UgaXQgaXMgcmVhZG9ubHkKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IGNyZWF0ZUZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZpbGUpOwotICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IHN3LmdldEJ1ZmZlcigpOwotICAgICAgZncud3JpdGUoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgZncuY2xvc2UoKTsKLSAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgIHsKLSAgICAgIGdldExvZygpLmVycm9yKCJFcnJvciBnZW5lcmF0aW5nICIgKyBjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFNldCBjcmVhdGVJbXBvcnRzKENvbnZlcnRlckJlYW4gY29udmVydGVyKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVTZXRQcm9wZXJ0eShQcmV0dHlXcml0ZXIgb3V0LCBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpOwotCi0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlU2V0UHJvcGVydGllcygKLSAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29udmVydGVyLnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIGNvbnZlcnRlckZ1bGxDbGFzcyA9IGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpOwotICAgICAgU3RyaW5nIGNvbnZlcnRlckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoY29udmVydGVyRnVsbENsYXNzKTsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbigicHJpdmF0ZSB2b2lkIF9zZXRQcm9wZXJ0aWVzKCIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oY29udmVydGVyQ2xhc3MgKyAiIGNvbnZlcnRlcikgdGhyb3dzIEpzcEV4Y2VwdGlvbiIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotICAgICAgICB3cml0ZVNldFByb3BlcnR5KG91dCwgcHJvcGVydHkpOwotICAgICAgfQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlQ3JlYXRlQ29udmVydGVyKAotICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb252ZXJ0ZXIucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29udmVydGVyRnVsbENsYXNzID0gY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCk7Ci0gICAgICBTdHJpbmcgY29udmVydGVyQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhjb252ZXJ0ZXJGdWxsQ2xhc3MpOwotCi0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgLy8gVE9ETzogcmVzdG9yZSBjb2Rpbmcgc3RhbmRhcmRzLCBhbmQgbWFrZSBmaW5hbAotICAgICAgaWYgKGlzMTIoKSkgewotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigicHJvdGVjdGVkIENvbnZlcnRlciBjcmVhdGVDb252ZXJ0ZXIoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgaWYgKGlzMTIoKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIlN0cmluZyBjb252ZXJ0ZXJJZCA9ICIgKyBjb252ZXJ0ZXJDbGFzcyArICAiLkNPTlZFUlRFUl9JRDsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oIkFwcGxpY2F0aW9uIGFwcGwgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0QXBwbGljYXRpb24oKTsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oY29udmVydGVyQ2xhc3MgKyAiIGNvbnZlcnRlciA9ICIgKwotICAgICAgICAgICAgICAgICAgICAiKCIgKyBjb252ZXJ0ZXJDbGFzcyArICIpYXBwbC5jcmVhdGVDb252ZXJ0ZXIoY29udmVydGVySWQpOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbihjb252ZXJ0ZXJDbGFzcyArICIgY29udmVydGVyID0gIiArCi0gICAgICAgICAgICAgICAgICAgICIoIiArIGNvbnZlcnRlckNsYXNzICsgIilzdXBlci5jcmVhdGVDb252ZXJ0ZXIoKTsiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJfc2V0UHJvcGVydGllcyhjb252ZXJ0ZXIpOyIpOwotICAgICAgb3V0LnByaW50bG4oInJldHVybiBjb252ZXJ0ZXI7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZURvU3RhcnRUYWcoCi0gICAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAoIWlzMTIoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbnZlcnRlckZ1bGxDbGFzcyA9IGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpOwotICAgICAgICBTdHJpbmcgY29udmVydGVyQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhjb252ZXJ0ZXJGdWxsQ2xhc3MpOwotCi0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIC8vIFRPRE86IHJlc3RvcmUgY29kaW5nIHN0YW5kYXJkcywgYW5kIG1ha2UgZmluYWwKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgICAgICBvdXQucHJpbnRsbigicHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJzdXBlci5zZXRDb252ZXJ0ZXJJZCgiICsgY29udmVydGVyQ2xhc3MgKyAiLkNPTlZFUlRFUl9JRCk7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gc3VwZXIuZG9TdGFydFRhZygpOyIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVDbGFzcyhQcmV0dHlXcml0ZXIgb3V0LCBBYnN0cmFjdFRhZ0JlYW4gYWJzdHJhY3RUYWcpIHsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoYWJzdHJhY3RUYWcuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgIiBleHRlbmRzIENvbnZlcnRlckVMVGFnIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgIiBleHRlbmRzIENvbnZlcnRlclRhZyIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdFRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ZmUyYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdFRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQWJzdHJhY3RUYWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhZ0dlbmVyYXRvciB7Ci0gIHByb3RlY3RlZCBMb2cgX2xvZzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gX2lzMTI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgX2xpY2Vuc2VIZWFkZXI7Ci0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfQVVUT19HRU5FUkFURV9XQVJOSU5HID0KLSIvLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSxcbiIrCi0iLy8gICAgICAgICAgb3IgeW91IHdpbGwgbG9zZSB5b3VyIGNoYW5nZXMuXG5cbiI7Ci0KLSAgcHVibGljIEFic3RyYWN0VGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMiwgU3RyaW5nIGxpY2Vuc2VIZWFkZXIsIExvZyBsb2cpIHsKLSAgICB0aGlzLl9sb2cgPSBsb2c7Ci0gICAgdGhpcy5fbGljZW5zZUhlYWRlciA9IGxpY2Vuc2VIZWFkZXI7Ci0gICAgdGhpcy5faXMxMiA9IGlzMTI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByZWFtYmxlKAotICAgIFByZXR0eVdyaXRlciBvdXQpCi0gIHsKLSAgICBvdXQud3JpdGUoX0FVVE9fR0VORVJBVEVfV0FSTklORyk7Ci0gICAgb3V0LndyaXRlKF9saWNlbnNlSGVhZGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMb2cgZ2V0TG9nKCkgewotICAgIHJldHVybiBfbG9nOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXMxMigpIHsKLSAgICByZXR1cm4gX2lzMTI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRmlsZSBjcmVhdGVGaWxlKEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBTdHJpbmcgZnVsbENsYXNzTmFtZSkgewotICAgICBnZXRMb2coKS5kZWJ1ZygiR2VuZXJhdGluZyAiICsgZnVsbENsYXNzTmFtZSk7Ci0gICAgIFN0cmluZyBzb3VyY2VQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgoZnVsbENsYXNzTmFtZSwgIi5qYXZhIik7Ci0gICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0KLSAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgIHJldHVybiB0YXJnZXRGaWxlOwotICAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlQ29uc3RydWN0b3IoCi0gICAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICAgIEFic3RyYWN0VGFnQmVhbiBhYnN0cmFjdFRhZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGZ1bGxDbGFzc05hbWUgPSBhYnN0cmFjdFRhZy5nZXRUYWdDbGFzcygpOwotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZ1bGxDbGFzc05hbWUpOwotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAgIC8vIFRPRE86IHJlc3RvcmUgdGhpcyBjb3JyZWN0bHkgcGhyYXNlZCBjb21tZW50ICh0ZW5zZSB2cy4gY29tbWFuZCkKLSAgICAgIC8vb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgICBvdXQucHJpbnRsbigiICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgIiArIGNsYXNzTmFtZSArICIoKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgICBBYnN0cmFjdFRhZ0JlYW4gYWJzdHJhY3RUYWcpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBhYnN0cmFjdFRhZy5wcm9wZXJ0aWVzKCk7Ci0gICAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgd3JpdGVQcm9wZXJ0eU1lbWJlcihvdXQsIHByb3BlcnR5KTsKLSAgICAgICAgd3JpdGVQcm9wZXJ0eVNldChvdXQsIHByb3BlcnR5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUHJvcGVydHlNZW1iZXIoCi0gICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgIFByb3BlcnR5QmVhbiAgcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgIFN0cmluZyBqc3BQcm9wVHlwZSA9IGdldEpzcFByb3BlcnR5VHlwZShwcm9wZXJ0eSk7Ci0KLSAgICBvdXQucHJpbnRsbigicHJpdmF0ZSAiICsganNwUHJvcFR5cGUgKyAiICIgKyBwcm9wVmFyICsgIjsiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZVByb3BlcnR5U2V0KAotICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICBQcm9wZXJ0eUJlYW4gIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgIFN0cmluZyBqc3BQcm9wVHlwZSA9IGdldEpzcFByb3BlcnR5VHlwZShwcm9wZXJ0eSk7Ci0KLSAgICAvLyBUT0RPOiByZXN0b3JlIGNvZGluZyBzdGFuZGFyZHMsIGFuZCBtYWtlIGZpbmFsCi0gICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyBzZXRNZXRob2QgKyAiKCIgKyBqc3BQcm9wVHlwZSArICIgIiArIHByb3BWYXIgKyAiKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJfIiArIHByb3BWYXIgKyAiID0gIiArIHByb3BWYXIgKyAiOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlbGVhc2UoCi0gICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgQWJzdHJhY3RUYWdCZWFuIGFic3RyYWN0VGFnKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBhYnN0cmFjdFRhZy5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBpZiAoaXMxMigpKSB7Ci0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCByZWxlYXNlKCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigic3VwZXIucmVsZWFzZSgpOyIpOwotICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbihwcm9wVmFyICsgIiA9IG51bGw7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SnNwUHJvcGVydHlUeXBlKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkKLSAgICAgIHJldHVybiAiTWV0aG9kRXhwcmVzc2lvbiI7Ci0KLSAgICBpZiAoaXMxMigpICYmIHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgICAgcmV0dXJuICJNZXRob2RFeHByZXNzaW9uIjsKLQotICAgIGlmIChpczEyKCkgJiYgIXByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSAgICAgIHJldHVybiAiVmFsdWVFeHByZXNzaW9uIjsKLSAgICByZXR1cm4gIlN0cmluZyI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUVuZChQcmV0dHlXcml0ZXIgb3V0KSB7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbXBvcnRzKAotICAgIFByZXR0eVdyaXRlciAgIG91dCwKLSAgICBBYnN0cmFjdFRhZ0JlYW4gIGFic3RyYWN0VGFnQmVhbiwgU2V0IGltcG9ydHMpCi0gIHsKLQotICAgIC8vIGRvIG5vdCBpbXBvcnQgaW1wbGljaXQhCi0gICAgaW1wb3J0cy5yZW1vdmVBbGwoVXRpbC5QUklNSVRJVkVfVFlQRVMpOwotCi0gICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhhYnN0cmFjdFRhZ0JlYW4uZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgR2VuZXJhdG9ySGVscGVyLndyaXRlSW1wb3J0cyhvdXQsIHBhY2thZ2VOYW1lLCBpbXBvcnRzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHdyaXRlSGVhZGVyKFByZXR0eVdyaXRlciBvdXQsIEFic3RyYWN0VGFnQmVhbiBjb252ZXJ0ZXIsIFNldCBpbXBvcnRzKSB7Ci0gICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgLy8gaGVhZGVyL2NvcHlyaWdodAotICAgIHdyaXRlUHJlYW1ibGUob3V0KTsKLQotICAgIC8vIHBhY2thZ2UKLSAgICBvdXQucHJpbnRsbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiOyIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICB3cml0ZUltcG9ydHMob3V0LCBjb252ZXJ0ZXIsIGltcG9ydHMpOwotCi0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGJsYW5rIGxpbmUuCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiICogQXV0by1nZW5lcmF0ZWQgdGFnIGNsYXNzLiIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEltcG9ydHNGcm9tUHJvcGVydGVzKEFic3RyYWN0VGFnQmVhbiBhYnN0cmFjdFRhZ0JlYW4sIFNldCBpbXBvcnRzKSB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGFic3RyYWN0VGFnQmVhbi5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0KLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLQotICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICBpZiAocHJvcGVydHlDbGFzcyAhPSBudWxsKQotICAgICAgICBpbXBvcnRzLmFkZChwcm9wZXJ0eUNsYXNzKTsKLQotICAgICAgaWYgKCJqYXZhLmxhbmcuU3RyaW5nW10iLmVxdWFscyhwcm9wZXJ0eUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZURhdGVUeXBlKFN0cmluZyBjbGFzc05hbWUsIGJvb2xlYW4gdXNlTWF4VGltZSkKLSAgewotICAgIFN0cmluZyB0eXBlID0gKFN0cmluZylfUkVTT0xWQUJMRV9UWVBFUy5nZXQoY2xhc3NOYW1lKTsKLSAgICByZXR1cm4gdXNlTWF4VGltZSA/IHR5cGUgKyAiV2l0aE1heFRpbWUiIDogdHlwZTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZVR5cGUoU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKV9SRVNPTFZBQkxFX1RZUEVTLmdldChjbGFzc05hbWUpOwotICB9Ci0KLSAgLy8gVE9ETzogZm9yIGV2ZXJ5dGhpbmcgYnV0IExvY2FsZSwgU3RyaW5nW10sIERhdGUsIGFuZCBUaW1lWm9uZSwKLSAgLy8gaW4gSlNGIDEuMiB3ZSBzaG91bGQgYWxyZWFkeSBiZSBnb2luZyB0aHJvdWdoIGNvZXJjaW9uLCBhbmQKLSAgLy8gbm90IG5lZWQgYW55IG9mIHRoZSAiVGFnVXRpbHMiIGZ1bmN0aW9ucwotICBwcml2YXRlIE1hcCBfY3JlYXRlUmVzb2x2YWJsZVR5cGVzKCkKLSAgewotICAgIE1hcCByZXNvbHZhYmxlVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiYm9vbGVhbiIsICJCb29sZWFuIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiY2hhciIsICJDaGFyYWN0ZXIiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLnV0aWwuRGF0ZSIsICJEYXRlIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiaW50IiwgIkludGVnZXIiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJmbG9hdCIsICJGbG9hdCIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImRvdWJsZSIsICJEb3VibGUiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLnV0aWwuTG9jYWxlIiwgIkxvY2FsZSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImxvbmciLCAiTG9uZyIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEubGFuZy5TdHJpbmciLCAiU3RyaW5nIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS5sYW5nLlN0cmluZ1tdIiwgIlN0cmluZ0FycmF5Iik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS51dGlsLlRpbWVab25lIiwgIlRpbWVab25lIik7Ci0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc29sdmFibGVUeXBlcyk7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIE1hcCBfUkVTT0xWQUJMRV9UWVBFUyA9IF9jcmVhdGVSZXNvbHZhYmxlVHlwZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMGJjNTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQWJzdHJhY3RUYWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUYWdHZW5lcmF0b3IgewotCi0gIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIsIFN0cmluZyBsaWNlbnNlSGVhZGVyLCBMb2cgbG9nKSB7Ci0gICAgc3VwZXIoaXMxMiwgbGljZW5zZUhlYWRlciwgbG9nKTsKLSAgfQotCi0gICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVRhZ0hhbmRsZXIoCi0gICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IsIEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5KQotICB7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5kZWJ1ZygiR2VuZXJhdGluZyAiICsgdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCkpOwotCi0gICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICBQcmV0dHlXcml0ZXIgb3V0ID0gbmV3IFByZXR0eVdyaXRlcihzdyk7Ci0gICAgICBTZXQgaW1wb3J0cyA9IGNyZWF0ZUltcG9ydHModmFsaWRhdG9yKTsKLSAgICAgIHdyaXRlSGVhZGVyKG91dCwgdmFsaWRhdG9yLCBpbXBvcnRzKTsKLQotICAgICAgd3JpdGVDbGFzcyhvdXQsIHZhbGlkYXRvcik7Ci0KLSAgICAgIHdyaXRlQ29uc3RydWN0b3Iob3V0LCB2YWxpZGF0b3IpOwotCi0gICAgICB3cml0ZVByb3BlcnR5TWV0aG9kcyhvdXQsIHZhbGlkYXRvcik7Ci0gICAgICB3cml0ZURvU3RhcnRUYWcob3V0LCB2YWxpZGF0b3IpOwotICAgICAgd3JpdGVDcmVhdGVWYWxpZGF0b3Iob3V0LCB2YWxpZGF0b3IpOwotICAgICAgd3JpdGVTZXRQcm9wZXJ0aWVzKG91dCwgdmFsaWRhdG9yKTsKLSAgICAgIHdyaXRlUmVsZWFzZShvdXQsIHZhbGlkYXRvcik7Ci0KLSAgICAgIHdyaXRlRW5kKG91dCk7Ci0KLSAgICAgIC8vIGRlbGF5IHdyaXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgIC8vIHRpbWVzdGFtcCBzaG91bGQgbm90IGJlIHVwZGF0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgIC8vIGRlbGV0ZSB0YXJnZXQgZmlsZSBmaXJzdCwgYmVjYXVzZSBpdCBpcyByZWFkb25seQotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gY3JlYXRlRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHZhbGlkYXRvci5nZXRUYWdDbGFzcygpKTsKLSAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIodGFyZ2V0RmlsZSk7Ci0gICAgICBTdHJpbmdCdWZmZXIgYnVmID0gc3cuZ2V0QnVmZmVyKCk7Ci0gICAgICBmdy53cml0ZShidWYudG9TdHJpbmcoKSk7Ci0gICAgICBmdy5jbG9zZSgpOwotICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgewotICAgICAgZ2V0TG9nKCkuZXJyb3IoIkVycm9yIGdlbmVyYXRpbmcgIiArIHZhbGlkYXRvci5nZXRUYWdDbGFzcygpLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2V0IGNyZWF0ZUltcG9ydHMoVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpOwotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlQ2xhc3MoUHJldHR5V3JpdGVyIG91dCwgQWJzdHJhY3RUYWdCZWFuIGFic3RyYWN0VGFnKSB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGFic3RyYWN0VGFnLmdldFRhZ0NsYXNzKCkpOwotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICIgZXh0ZW5kcyBWYWxpZGF0b3JFTFRhZyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICIgZXh0ZW5kcyBWYWxpZGF0b3JUYWciKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZURvU3RhcnRUYWcoCi0gICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICB7Ci0gICAgIG91dC5wcmludGxuKCk7Ci0gICAgIGlmICghaXMxMigpKQotICAgICB7Ci0gICAgICAgU3RyaW5nIHZhbGlkYXRvckZ1bGxDbGFzcyA9IHZhbGlkYXRvci5nZXRWYWxpZGF0b3JDbGFzcygpOwotICAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHZhbGlkYXRvckZ1bGxDbGFzcyk7Ci0KLSAgICAgICAvLyBUT0RPOiByZXN0b3JlIGNvZGluZyBzdGFuZGFyZHMsIGFuZCBtYWtlIGZpbmFsCi0gICAgICAgLy9vdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24iKTsKLSAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICBvdXQucHJpbnRsbigic3VwZXIuc2V0VmFsaWRhdG9ySWQoIiArIHZhbGlkYXRvckNsYXNzICsgIi5WQUxJREFUT1JfSUQpOyIpOwotICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gc3VwZXIuZG9TdGFydFRhZygpOyIpOwotICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgIH0KLSAgIH0KLQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUNyZWF0ZVZhbGlkYXRvcigKLSAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gdmFsaWRhdG9yLnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIHZhbGlkYXRvckZ1bGxDbGFzcyA9IHZhbGlkYXRvci5nZXRWYWxpZGF0b3JDbGFzcygpOwotICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3ModmFsaWRhdG9yRnVsbENsYXNzKTsKLQotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIC8vIFRPRE86IHJlc3RvcmUgY29kaW5nIHN0YW5kYXJkcywgYW5kIG1ha2UgZmluYWwKLSAgICAgIGlmIChpczEyKCkpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oInByb3RlY3RlZCBWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIGlmIChpczEyKCkpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgdmFsaWRhdG9ySWQgPSAiICsgdmFsaWRhdG9yQ2xhc3MgKyAiLlZBTElEQVRPUl9JRDsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oIkFwcGxpY2F0aW9uIGFwcGwgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0QXBwbGljYXRpb24oKTsiKTsKLSAgICAgICAgb3V0LnByaW50bG4odmFsaWRhdG9yQ2xhc3MgKyAiIHZhbGlkYXRvciA9ICIgKwotICAgICAgICAgICAgICAgICAgICAiKCIgKyB2YWxpZGF0b3JDbGFzcyArICIpYXBwbC5jcmVhdGVWYWxpZGF0b3IodmFsaWRhdG9ySWQpOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbih2YWxpZGF0b3JDbGFzcyArICIgdmFsaWRhdG9yID0gIiArCi0gICAgICAgICAgICAgICAgICAgICIoIiArIHZhbGlkYXRvckNsYXNzICsgIilzdXBlci5jcmVhdGVWYWxpZGF0b3IoKTsiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJfc2V0UHJvcGVydGllcyh2YWxpZGF0b3IpOyIpOwotICAgICAgb3V0LnByaW50bG4oInJldHVybiB2YWxpZGF0b3I7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlU2V0UHJvcGVydGllcygKLSAgICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSB2YWxpZGF0b3IucHJvcGVydGllcygpOwotICAgICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JGdWxsQ2xhc3MgPSB2YWxpZGF0b3IuZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3ModmFsaWRhdG9yRnVsbENsYXNzKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgb3V0LnByaW50bG4oInByaXZhdGUgdm9pZCBfc2V0UHJvcGVydGllcygiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbih2YWxpZGF0b3JDbGFzcyArICIgdmFsaWRhdG9yKSB0aHJvd3MgSnNwRXhjZXB0aW9uIik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICAgICAgd3JpdGVTZXRQcm9wZXJ0eShvdXQsIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVTZXRQcm9wZXJ0eSgKLSAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9Db21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YzQ3MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9Db21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuQ2xhc3NHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGFnIGNsYXNzZXMKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50VGFnR2VuZXJhdG9yIGV4dGVuZHMgQ2xhc3NHZW5lcmF0b3IKLXsKLQotICB2b2lkIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVNldFByb3BlcnRpZXNNZXRob2QoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlUmVsZWFzZU1ldGhvZChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVSZWxlYXNlTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29tcG9uZW50cykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVHZXRDb21wb25lbnRUeXBlKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZUdldFJlbmRlcmVyVHlwZShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVByb3BlcnR5TWVtYmVycyhQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVByb3BlcnR5TWVtYmVycyhQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29tcG9uZW50cykgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc0NvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc0NvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGYxY2VjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5NZXRob2RTaWduYXR1cmVCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBDb21wb25lbnQgdGFnIGdlbmVyYXRvciBmb3IgbXlmYWNlcwotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIE15RmFjZXNDb21wb25lbnRUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudFRhZ0dlbmVyYXRvcgotewotICBwcml2YXRlIGJvb2xlYW4gX2lzMTI7Ci0KLSAgcHVibGljIE15RmFjZXNDb21wb25lbnRUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyKQotICB7Ci0gICAgX2lzMTIgPSBpczEyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpczEyKCkKLSAgewotICAgIHJldHVybiBfaXMxMjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmljSW1wb3J0cyhTZXQgaW1wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudCIpOwotICAgIGltcG9ydHMuYWRkKGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpKTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQiKTsKLSAgICB9Ci0gICAgICAgIAotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0KLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLQotICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbnZlcnRlcihwcm9wZXJ0eUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFfaXMxMikKLSAgICAgICAgewotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICAgICAgfQotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXIiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgICAgewotICAgICAgICBpZiAoX2lzMTIpCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiIpOwotICAgICAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNBY3Rpb25MaXN0ZW5lcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5ldmVudC5NZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbHVlQ2hhbmdlTGlzdGVuZXIocHJvcGVydHksIF9pczEyKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZXZlbnQuTWV0aG9kRXhwcmVzc2lvblZhbHVlQ2hhbmdlTGlzdGVuZXIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy52YWxpZGF0b3IuTWV0aG9kRXhwcmVzc2lvblZhbGlkYXRvciIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0FjdGlvbkxpc3RlbmVyKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5ldmVudC5NZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbHVlQ2hhbmdlTGlzdGVuZXIocHJvcGVydHksIF9pczEyKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmV2ZW50Lk1ldGhvZEV4cHJlc3Npb25WYWx1ZUNoYW5nZUxpc3RlbmVyIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IocHJvcGVydHksIF9pczEyKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLnZhbGlkYXRvci5NZXRob2RFeHByZXNzaW9uVmFsaWRhdG9yIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24oUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZmllbGRQcm9wTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIGpzcFByb3BUeXBlID0gR2VuZXJhdG9ySGVscGVyLmdldEpzcFByb3BlcnR5VHlwZShwcm9wZXJ0eSwgX2lzMTIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigicHJpdmF0ZSAiICsganNwUHJvcFR5cGUgKyAiICIgKyBmaWVsZFByb3BOYW1lICsgIjsiKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlTZXR0ZXIoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIGZpZWxkUHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBqc3BQcm9wTmFtZSA9IHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwganNwUHJvcE5hbWUpOwotICAgIFN0cmluZyBqc3BQcm9wVHlwZSA9IEdlbmVyYXRvckhlbHBlci5nZXRKc3BQcm9wZXJ0eVR5cGUocHJvcGVydHksIF9pczEyKTsKLQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgc2V0TWV0aG9kICsgIigiICsganNwUHJvcFR5cGUgKyAiICIgKyBwcm9wVmFyICsgIikiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbihmaWVsZFByb3BOYW1lICsgIiA9ICIgKyBwcm9wVmFyICsgIjsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVHZXRDb21wb25lbnRUeXBlKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgaWYoImphdmF4LmZhY2VzLkh0bWxDb2x1bW4iLmVxdWFscyhjb21wb25lbnRUeXBlKSkKLSAgICB7Ci0gICAgICBjb21wb25lbnRUeXBlID0gImphdmF4LmZhY2VzLkNvbHVtbiI7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICAvLyBUaGUgc3VwZXJjbGFzcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBuZWVkIHRvIGhhdmUgdGhpcyBtZXRob2QKLSAgICBpZiAoaXMxMigpKXsKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHVibGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuIFwiIiArIGNvbXBvbmVudFR5cGUgKyAiXCI7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgQ29sbGVjdGlvbiBjb21wb25lbnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBjb21wb25lbnRzLmFkZChjb21wb25lbnQpOwotICAgIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChvdXQsIGNvbXBvbmVudENsYXNzLCBjb21wb25lbnRzKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsIFN0cmluZyBjb21wb25lbnRDbGFzcywgQ29sbGVjdGlvbiBjb21wb25lbnRzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQotICAgIENvbGxlY3Rpb24gYWxsID0gbmV3IEhhc2hTZXQoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGxJdGVyYXRvciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgbEl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbikgbEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEl0ZXJhdG9yIHByb3AgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgICAgd2hpbGUgKHByb3AuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBhbGwuYWRkKHByb3AubmV4dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gYWxsLml0ZXJhdG9yKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInByb3RlY3RlZCB2b2lkIHNldFByb3BlcnRpZXMoVUlDb21wb25lbnQgY29tcG9uZW50KSIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgd3JpdGVTZXRQcm9wZXJ0eU1ldGhvZEJvZHkob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydGllcyk7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlU2V0UHJvcGVydHlNZXRob2RCb2R5KFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgcHJvcGVydGllcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQotICAgIGlmKCJIdG1sQ29sdW1uIi5lcXVhbHMoY29tcG9uZW50Q2xhc3MpKQotICAgIHsKLSAgICAgICAgY29tcG9uZW50Q2xhc3MgPSAiVUlDb2x1bW4iOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCJpZiAoIShjb21wb25lbnQgaW5zdGFuY2VvZiAiICsgY29tcG9uZW50Q2xhc3MgKyAiKSkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnQoInRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIik7Ci0gICAgb3V0LnByaW50KCJcIkNvbXBvbmVudCBcIiArIGNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArIFwiIGlzIG5vICIgKyBjb21wb25lbnRDbGFzcyArICJcIiIpOwotICAgIG91dC5wcmludGxuKCIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0KLSAgICBvdXQucHJpbnRsbihjb21wb25lbnRDbGFzcyArICIgY29tcCA9ICgiICsgY29tcG9uZW50Q2xhc3MgKyAiKWNvbXBvbmVudDsiKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oInN1cGVyLnNldFByb3BlcnRpZXMoY29tcG9uZW50KTsiKTsKLSAgICBvdXQucHJpbnRsbigpOwotCi0gICAgaWYgKCFfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiRmFjZXNDb250ZXh0IGNvbnRleHQgPSBnZXRGYWNlc0NvbnRleHQoKTsiKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICBfd3JpdGVTZXRQcm9wZXJ0aWVzQ2FzZShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldFByb3BlcnRpZXNDYXNlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQotICAgIGlmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRNZXRob2RCaW5kaW5nKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpCi0gICAgewotICAgICAgX3dyaXRlU2V0TWV0aG9kRXhwcmVzc2lvbihvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbnZlcnRlcihwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKQotICAgIHsKLSAgICAgIF93cml0ZVNldENvbnZlcnRlcihvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRQcm9wZXJ0eShvdXQsIHByb3BlcnR5KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0UHJvcGVydHkoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLSAgICAKLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSAiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIGlmIChwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgewotICAgICAgaWYgKF9pczEyKXsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgfWVsc2V7Ci0gICAgICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkudHJpbSgpOwotICAgICAgICAgIGlmIChwcm9wZXJ0eUNsYXNzLnN0YXJ0c1dpdGgoImphdmEubGFuZy4iKSl7Ci0gICAgICAgICAgICAgIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eUNsYXNzLnJlcGxhY2UoImphdmEubGFuZy4iLCAiIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmIChwcm9wZXJ0eUNsYXNzLmVuZHNXaXRoKCJlZ2VyIikpewotICAgICAgICAgICAgICBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHlDbGFzcy5yZXBsYWNlKCJlZ2VyIiwgIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5Q2xhc3MudG9Mb3dlckNhc2UoKSkpewotICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICBVdGlsLmdldEJveGVkQ2xhc3MocHJvcGVydHlDbGFzcy50b0xvd2VyQ2FzZSgpKSsiLnZhbHVlT2YoIiArIHByb3BWYXIgKyAiKSk7Iik7ICAgICAgICAgICAgICAgIAotICAgICAgICAgIH1lbHNleyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgb3V0LnByaW50bG4oImNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dChcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImNvbXAuc2V0VmFsdWVFeHByZXNzaW9uKFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgX3dyaXRlU2V0VmFsdWVCaW5kaW5nKG91dCwgcHJvcGVydHksIHByb3BOYW1lLCBwcm9wVmFyKTsKLSAgICB9Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRWYWx1ZUJpbmRpbmcoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgU3RyaW5nIHByb3BOYW1lLAotICAgICAgU3RyaW5nIHByb3BWYXIpCi0gIHsKLSAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgIG91dC5wcmludGxuKCJjb21wLnNldFZhbHVlQmluZGluZyhcIiIgKyBwcm9wTmFtZSArICJcIiwgdmIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBpZiAoIWlzMTIoKSAmJiAidmFsdWUiLmVxdWFscyhwcm9wTmFtZSkpCi0gICAgewotICAgICAgICBvdXQucHJpbnRsbigiY29tcC5zZXRWYWx1ZSgiICsgcHJvcFZhciArICIpOyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpewotICAgICAgICAgICAgb3V0LnByaW50bG4oImNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dChcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICAgIFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKyIudmFsdWVPZigiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlDbGFzcy5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpewotICAgICAgICAgICAgICAgIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eUNsYXNzLnJlcGxhY2UoImphdmEubGFuZy4iLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eUNsYXNzLmVuZHNXaXRoKCJlZ2VyIikpewotICAgICAgICAgICAgICAgIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eUNsYXNzLnJlcGxhY2UoImVnZXIiLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlDbGFzcy50b0xvd2VyQ2FzZSgpKSl7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dChcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBVdGlsLmdldEJveGVkQ2xhc3MocHJvcGVydHlDbGFzcy50b0xvd2VyQ2FzZSgpKSsiLnZhbHVlT2YoIiArIHByb3BWYXIgKyAiKSk7Iik7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfWVsc2V7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRNZXRob2RCaW5kaW5nKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQWN0aW9uTGlzdGVuZXIocHJvcGVydHksIF9pczEyKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbXAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IE1ldGhvZEV4cHJlc3Npb25BY3Rpb25MaXN0ZW5lcigiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbHVlQ2hhbmdlTGlzdGVuZXIocHJvcGVydHksIF9pczEyKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbXAuYWRkVmFsdWVDaGFuZ2VMaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvblZhbHVlQ2hhbmdlTGlzdGVuZXIoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IocHJvcGVydHksIF9pczEyKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbXAuYWRkVmFsaWRhdG9yKG5ldyBNZXRob2RFeHByZXNzaW9uVmFsaWRhdG9yKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgICAgICAibmV3IE1ldGhvZEV4cHJlc3Npb25NZXRob2RCaW5kaW5nKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgfQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbiBzaWduYXR1cmUgPSBwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbVR5cGVzID0gKHNpZ25hdHVyZSAhPSBudWxsKSA/IHNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcygpIDogbnVsbDsKLQotICAgICAgU3RyaW5nIGNsYXNzQXJyYXk7Ci0KLSAgICAgIGlmIChwYXJhbVR5cGVzID09IG51bGwgfHwgcGFyYW1UeXBlcy5sZW5ndGggPT0gMCkKLSAgICAgIHsKLSAgICAgICAgY2xhc3NBcnJheSA9ICJuZXcgQ2xhc3NbMF0iOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgibmV3IENsYXNzW117Iik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgIHNiLmFwcGVuZChwYXJhbVR5cGVzW2ldKTsKLSAgICAgICAgICBzYi5hcHBlbmQoIi5jbGFzcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRyYWlsaW5nIGNvbW1hCi0gICAgICAgIHNiLmFwcGVuZCgnLCcpOwotCi0gICAgICAgIHNiLmFwcGVuZCgnfScpOwotICAgICAgICBjbGFzc0FycmF5ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICAgIGlmIChpc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKHNpZ25hdHVyZSkgfHwgcHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkuZXF1YWxzKCJhY3Rpb24iKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIk1ldGhvZEJpbmRpbmcgbWI7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJtYiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVNZXRob2RCaW5kaW5nKCIgKyBwcm9wVmFyICsgIiwgIiArIGNsYXNzQXJyYXkgKyAiKTsiKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghaXMxMigpICYmIHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpLmVxdWFscygiYWN0aW9uIikpewotICAgICAgICAgICAgb3V0LnByaW50bG4oIm1iID0gbmV3IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfdG9tYWhhd2suZWwuU2ltcGxlQWN0aW9uTWV0aG9kQmluZGluZygiK3Byb3BWYXIrIik7Iik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJJbnZhbGlkIGV4cHJlc3Npb24gXCIgKyAiK3Byb3BWYXIrIik7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIG5ldmVyIGEgbGl0ZXJhbCwgbm8gbmVlZCBmb3IgQ29uc3RhbnRNZXRob2RCaW5kaW5nCi0gICAgICAgIG91dC5wcmludGxuKCJNZXRob2RCaW5kaW5nIG1iID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZU1ldGhvZEJpbmRpbmcoIiArIHByb3BWYXIgKyAiLCAiICsKLSAgICAgICAgICAgIGNsYXNzQXJyYXkgKyAiKTsiKTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAKLSAgICAgIG91dC5wcmludGxuKCJjb21wLiIrc2V0TWV0aG9kKyIobWIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRNZXRob2RFeHByZXNzaW9uKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0KLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSAiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNBY3Rpb24ocHJvcGVydHkpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLnNldEFjdGlvbkV4cHJlc3Npb24oIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQWN0aW9uTGlzdGVuZXIocHJvcGVydHksIF9pczEyKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImNvbXAuIiArIFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKSArICIoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICB9Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRLZXlTdHJva2UoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUV4cHJlc3Npb24oIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJPYmplY3QgdmFsID0gIiArIHByb3BWYXIgKyAiLmdldFZhbHVlKG51bGwpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmICh2YWwgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIlx0S2V5U3Ryb2tlLmdldEtleVN0cm9rZSh2YWwudG9TdHJpbmcoKSkpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlQmluZGluZygiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJcdEtleVN0cm9rZS5nZXRLZXlTdHJva2UoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldENvbnZlcnRlcigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLnNldFZhbHVlRXhwcmVzc2lvbihcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyBzID0gIiArIHByb3BWYXIgKyAiLmdldEV4cHJlc3Npb25TdHJpbmcoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAocyAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLQotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRGYWNlc0NvbnRleHQoKS5nZXRBcHBsaWNhdGlvbigpLiIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNyZWF0ZUNvbnZlcnRlcihzKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNvbXAuc2V0Q29udmVydGVyKGNvbnZlcnRlcik7Iik7Ci0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLnNldFZhbHVlQmluZGluZyhcIiIgK3Byb3BOYW1lKyAiXCIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRGYWNlc0NvbnRleHQoKS5nZXRBcHBsaWNhdGlvbigpLiIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNyZWF0ZUNvbnZlcnRlcigiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC5zZXRDb252ZXJ0ZXIoY29udmVydGVyKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKAotICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbiBzaWcpCi0gIHsKLSAgICByZXR1cm4gKHNpZyAhPSBudWxsICYmICJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMoc2lnLmdldFJldHVyblR5cGUoKSkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4ZDk1NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzQ29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbnZlcnRlckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgY2xhc3MgTXlGYWNlc0NvbnZlcnRlclRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yIHsKLQotICBwdWJsaWMgTXlGYWNlc0NvbnZlcnRlclRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIsIFN0cmluZyBsaWNlbnNlSGVhZGVyLCBMb2cgbG9nKSB7Ci0gICAgc3VwZXIoaXMxMiwgbGljZW5zZUhlYWRlciwgbG9nKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTZXQgY3JlYXRlSW1wb3J0cyhDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikgewotICAgIFNldCBpbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5Db252ZXJ0ZXJFTFRhZyIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Iik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuQ29udmVydGVyVGFnIik7Ci0gICAgfQotCi0gICAgaW1wb3J0cy5hZGQoImphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiIpOwotICAgIGltcG9ydHMuYWRkKGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlciIpOwotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgIH0KLSAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMudXRpbC5UYWdVdGlscyIpOwotCi0KLSAgICBhZGRJbXBvcnRzRnJvbVByb3BlcnRlcyhjb252ZXJ0ZXIsIGltcG9ydHMpOwotICAgIHJldHVybiBpbXBvcnRzOwotICB9Ci0KLQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXRQcm9wZXJ0eSgKLSAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wRnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0KLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuc2V0VmFsdWVFeHByZXNzaW9uKFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOwotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiLmdldFZhbHVlKG51bGwpKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKFRhZ1V0aWxzLmlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gVGFnVXRpbHMuZ2V0VmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLnNldFZhbHVlQmluZGluZyhcIiIgKyBwcm9wTmFtZSArICJcIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzVmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzVmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzU1MzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc1ZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5WYWxpZGF0b3JCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotcHVibGljIGNsYXNzIE15RmFjZXNWYWxpZGF0b3JUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvciB7Ci0KLSAgcHVibGljIE15RmFjZXNWYWxpZGF0b3JUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyLCBTdHJpbmcgbGljZW5zZUhlYWRlciwgTG9nIGxvZykgewotICAgIHN1cGVyKGlzMTIsIGxpY2Vuc2VIZWFkZXIsIGxvZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2V0IGNyZWF0ZUltcG9ydHMoVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpIHsKLSAgICBTZXQgaW1wb3J0cyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuVmFsaWRhdG9yRUxUYWciKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dCIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLlZhbGlkYXRvclRhZyIpOwotICAgIH0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uIik7Ci0gICAgaW1wb3J0cy5hZGQodmFsaWRhdG9yLmdldFZhbGlkYXRvckNsYXNzKCkpOwotCi0gICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IiKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgIH0KLSAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMudXRpbC5UYWdVdGlscyIpOwotCi0KLSAgICBhZGRJbXBvcnRzRnJvbVByb3BlcnRlcyh2YWxpZGF0b3IsIGltcG9ydHMpOwotICAgIHJldHVybiBpbXBvcnRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXRQcm9wZXJ0eSgKLSAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wRnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci5zZXRWYWx1ZUV4cHJlc3Npb24oXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIuZ2V0VmFsdWUobnVsbCkpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoVGFnVXRpbHMuaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBUYWdVdGlscy5nZXRWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3Iuc2V0VmFsdWVCaW5kaW5nKFwiIiArIHByb3BOYW1lICsgIlwiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsKLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UYWdBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RhZ0F0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTFjMzg3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RhZ0F0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuUHJvcGVydHlGaWx0ZXI7Ci0KLS8qKgotICogVE9ETzogY29tbWVudCB0aGlzIQotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIFRhZ0F0dHJpYnV0ZUZpbHRlciBleHRlbmRzIFByb3BlcnR5RmlsdGVyCi17Ci0gIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiAoIXByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZENvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdhZGMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5HZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuTWV0aG9kU2lnbmF0dXJlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVE9ETzogY29tbWVudCB0aGlzIQotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50VGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnRUYWdHZW5lcmF0b3IKLXsKLSAgcHJpdmF0ZSBib29sZWFuIF9pczEyOwotCi0gIHB1YmxpYyBUcmluaWRhZENvbXBvbmVudFRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIpCi0gIHsKLSAgICBfaXMxMiA9IGlzMTI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpczEyKCkKLSAgewotICAgIHJldHVybiBfaXMxMjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmljSW1wb3J0cyhTZXQgaW1wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5iZWFuLkZhY2VzQmVhbiIpOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICB9Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLQotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgU3RyaW5nW10gcHJvcGVydHlDbGFzc1BhcmFtcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgIGltcG9ydHMuYWRkKGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpKTsKLQotICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc0tleVN0cm9rZShwcm9wZXJ0eUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pczEyKQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LnN3aW5nLktleVN0cm9rZSIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQVdUS2V5U3Ryb2tlKHByb3BlcnR5Q2xhc3MpKQotICAgICAgewotICAgICAgICBpZiAoX2lzMTIpCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YS5hd3QuQVdUS2V5U3Ryb2tlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb252ZXJ0ZXIocHJvcGVydHlDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaXMxMikKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlciIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNWaXJ0dWFsKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaXMxMikKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIudXRpbC5WaXJ0dWFsQXR0cmlidXRlVXRpbHMiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbG9yTGlzdChwcm9wZXJ0eUNsYXNzLCBwcm9wZXJ0eUNsYXNzUGFyYW1zKSB8fAotICAgICAgICAgICAgICAgR2VuZXJhdG9ySGVscGVyLmlzQ29sb3IocHJvcGVydHlDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaXMxMikKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24iKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi51dGlsLlRhZ1V0aWxzIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pczEyKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iKTsKLSAgICAgICAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLnV0aWwuTWV0aG9kRXhwcmVzc2lvbk1ldGhvZEJpbmRpbmciKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzRW51bSgpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZChwcm9wZXJ0eUNsYXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBmaWVsZFByb3BOYW1lID0gIl8iICsgcHJvcE5hbWU7Ci0gICAgU3RyaW5nIGpzcFByb3BUeXBlID0gR2VuZXJhdG9ySGVscGVyLmdldEpzcFByb3BlcnR5VHlwZShwcm9wZXJ0eSwgX2lzMTIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigicHJpdmF0ZSAiICsganNwUHJvcFR5cGUgKyAiICIgKyBmaWVsZFByb3BOYW1lICsgIjsiKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlTZXR0ZXIoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIGZpZWxkUHJvcE5hbWUgPSAiXyIgKyBwcm9wTmFtZTsKLSAgICBTdHJpbmcganNwUHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIGpzcFByb3BOYW1lKTsKLSAgICBTdHJpbmcganNwUHJvcFR5cGUgPSBHZW5lcmF0b3JIZWxwZXIuZ2V0SnNwUHJvcGVydHlUeXBlKHByb3BlcnR5LCBfaXMxMik7Ci0KLSAgICBvdXQucHJpbnQoImZpbmFsICIpOwotICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgc2V0TWV0aG9kICsgIigiICsganNwUHJvcFR5cGUgKyAiICIgKyBwcm9wVmFyICsgIikiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbihmaWVsZFByb3BOYW1lICsgIiA9ICIgKyBwcm9wVmFyICsgIjsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgIGNvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0gICAgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKG91dCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudHMpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVNldFByb3BlcnRpZXNNZXRob2QoUHJldHR5V3JpdGVyIG91dCwgU3RyaW5nIGNvbXBvbmVudENsYXNzLCBDb2xsZWN0aW9uIGNvbXBvbmVudHMpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIENvbGxlY3Rpb24gYWxsID0gbmV3IEhhc2hTZXQoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGxJdGVyYXRvciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgbEl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbikgbEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEl0ZXJhdG9yIHByb3AgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgICAgd2hpbGUgKHByb3AuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBhbGwuYWRkKHByb3AubmV4dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gYWxsLml0ZXJhdG9yKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0KLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICAgIG91dC5wcmludGxuKCJwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzKCIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIkZhY2VzQmVhbiBiZWFuKSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotCi0gICAgICB3cml0ZVNldFByb3BlcnR5TWV0aG9kQm9keShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0aWVzKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNldFByb3BlcnR5TWV0aG9kQm9keShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBvdXQucHJpbnRsbigic3VwZXIuc2V0UHJvcGVydGllcyhiZWFuKTsiKTsKLQotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIF93cml0ZVNldFByb3BlcnRpZXNDYXNlKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0UHJvcGVydGllc0Nhc2UoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLSAgICAKLSAgICBpZiAocHJvcGVydHkuaXNWaXJ0dWFsKCkpCi0gICAgewotICAgICAgX3dyaXRlVmlydHVhbFNldE1ldGhvZChvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgIHsKLSAgICAgIF93cml0ZVNldE1ldGhvZEJpbmRpbmcob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRNZXRob2RFeHByZXNzaW9uKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkuaXNFbnVtKCkpCi0gICAgewotICAgICAgX3dyaXRlU2V0RW51bShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0tleVN0cm9rZShwcm9wQ2xhc3MpKQotICAgIHsKLSAgICAgIF93cml0ZVNldEtleVN0cm9rZShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0FXVEtleVN0cm9rZShwcm9wQ2xhc3MpKQotICAgIHsKLSAgICAgIF93cml0ZVNldEFXVEtleVN0cm9rZShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbG9yTGlzdChwcm9wQ2xhc3MsIHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCkpKQotICAgIHsKLSAgICAgIF93cml0ZVNldENvbG9yKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lLCB0cnVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29sb3IocHJvcENsYXNzKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRDb2xvcihvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSwgZmFsc2UpOwotICAgIH0KLSAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb252ZXJ0ZXIocHJvcENsYXNzKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRDb252ZXJ0ZXIob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgewotICAgICAgX3dyaXRlU2V0TGl0ZXJhbChvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSwgcHJvcENsYXNzLCBwcm9wVmFyKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImphdmEudXRpbC5EYXRlIi5lcXVhbHMocHJvcENsYXNzKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXREYXRlKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lLCBwcm9wQ2xhc3MsIHByb3BWYXIsIHByb3BlcnR5LmdldFVzZU1heFRpbWUoKSk7Ci0gICAgfQotICAgIGVsc2UgLy9pZiAoX2hhc1Byb3BlcnR5U2V0dGVyKHByb3BlcnR5KSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRQcm9wZXJ0eShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSwgcHJvcENsYXNzLCBwcm9wVmFyKTsKLSAgICB9Ci0gICAgLy8gICAgZWxzZQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgIF93cml0ZVNldFZhbHVlQmluZGluZyhvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSwgcHJvcFZhcik7Ci0gICAgLy8gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldExpdGVyYWwoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lLAotICAgICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcFZhcikKLSAgewotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBTdHJpbmcgYm94ZWRDbGFzcyA9IFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wQ2xhc3MpOwotICAgIGlmICgoIV9pczEyICYmICFib3hlZENsYXNzLmVxdWFscyhwcm9wQ2xhc3MpKSB8fAotICAgICAgICAiamF2YS51dGlsLkRhdGUiLmVxdWFscyhwcm9wRnVsbENsYXNzKSB8fAotICAgICAgICAoYm94ZWRDbGFzcy5pbmRleE9mKCJbXSIpICE9IC0xKSkKLSAgICB7Ci0gICAgICAvLyBUT0RPOiByZWplY3QgdmFsdWUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgbGl0ZXJhbC1vbmx5Ci0gICAgICBfd3JpdGVTZXRQcm9wZXJ0eShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSwgcHJvcEZ1bGxDbGFzcywgcHJvcFZhcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArCi0gICAgICAgICAgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgICAgcHJvcFZhciArICIpOyIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXREYXRlKAotICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgIFN0cmluZyBwcm9wTmFtZSwKLSAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcywKLSAgICBTdHJpbmcgcHJvcFZhciwKLSAgICBib29sZWFuIHVzZU1heFRpbWUpCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBTdHJpbmcgYm94ZWRDbGFzcyA9IFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wQ2xhc3MpOwotICAgIFN0cmluZyBzZXRQcm9wZXJ0eSA9ICJzZXRQcm9wZXJ0eSI7Ci0gICAgU3RyaW5nIHByb3BUeXBlID0gYm94ZWRDbGFzcy5yZXBsYWNlQWxsKCJcXFtcXF0iLCAiQXJyYXkiKTsKLSAgICBpZiAodXNlTWF4VGltZSkKLSAgICB7Ci0gICAgICBzZXRQcm9wZXJ0eSA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldE1heCIsIHByb3BUeXBlICsgIlByb3BlcnR5Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRQcm9wZXJ0eSA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BUeXBlICsgIlByb3BlcnR5Iik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oc2V0UHJvcGVydHkgKyAiKGJlYW4sICIgKwotICAgICAgICBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgcHJvcFZhciArICIpOyIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldFByb3BlcnR5KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSwKLSAgICAgIFN0cmluZyBwcm9wRnVsbENsYXNzLAotICAgICAgU3RyaW5nIHByb3BWYXIpCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBTdHJpbmcgYm94ZWRDbGFzcyA9IFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wQ2xhc3MpOwotICAgIFN0cmluZyBzZXRQcm9wZXJ0eSA9ICJzZXRQcm9wZXJ0eSI7Ci0gICAgaWYgKCghX2lzMTIgJiYgIWJveGVkQ2xhc3MuZXF1YWxzKHByb3BDbGFzcykpIHx8Ci0gICAgICAgIEdlbmVyYXRvckhlbHBlci5pc051bWJlcihwcm9wRnVsbENsYXNzKSB8fAotICAgICAgICAiamF2YS51dGlsLkRhdGUiLmVxdWFscyhwcm9wRnVsbENsYXNzKSB8fAotICAgICAgICAoYm94ZWRDbGFzcy5pbmRleE9mKCJbXSIpICE9IC0xKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSBib3hlZENsYXNzLnJlcGxhY2VBbGwoIlxcW1xcXSIsICJBcnJheSIpOwotICAgICAgc2V0UHJvcGVydHkgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wVHlwZSArICJQcm9wZXJ0eSIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKHNldFByb3BlcnR5ICsgIihiZWFuLCAiICsKLSAgICAgICAgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nW10gX2dldEFjY2Vzc0tleVByb3BlcnR5S2V5cygKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSkKLSAgewotICAgIFN0cmluZ1tdIHByb3BLZXlzID0gbmV3IFN0cmluZ1syXTsKLQotICAgIGludCBvZmZzZXQgPSBwcm9wTmFtZS5pbmRleE9mKCJBbmRBY2Nlc3NLZXkiKTsKLSAgICBpZiAob2Zmc2V0ICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZyBtYWluUHJvcCA9IHByb3BOYW1lLnN1YnN0cmluZygwLCBvZmZzZXQpOwotICAgICAgcHJvcEtleXNbMF0gPSBjb21wb25lbnRDbGFzcyArICIuIiArCi0gICAgICAgICAgVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkobWFpblByb3AsICJfS0VZIik7Ci0gICAgICBwcm9wS2V5c1sxXSA9IGNvbXBvbmVudENsYXNzICsgIi4iICsKLSAgICAgICAgICBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eSgiYWNjZXNzS2V5IiwgIl9LRVkiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcHJvcEtleXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0VmFsdWVCaW5kaW5nKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSwKLSAgICAgIFN0cmluZyBwcm9wVmFyKQotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUJpbmRpbmcoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKwotICAgICAgICAiY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVZpcnR1YWxTZXRNZXRob2QoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHByb3BLZXlzID0gX2dldEFjY2Vzc0tleVByb3BlcnR5S2V5cyhjb21wb25lbnRDbGFzcywgcHJvcE5hbWUpOwotCi0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZpcnR1YWxBdHRyaWJ1dGVVdGlscy5zZXRBY2Nlc3NLZXlBdHRyaWJ1dGUoIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BWYXIgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMF0gKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMV0gKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHMgPSAiICsgcHJvcFZhciArICIuZ2V0RXhwcmVzc2lvblN0cmluZygpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmIChzICE9IG51bGwpIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmlydHVhbEF0dHJpYnV0ZVV0aWxzLnNldEFjY2Vzc0tleUF0dHJpYnV0ZSgiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLCIpOwotICAgICAgb3V0LnByaW50bG4oInMsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1swXSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1sxXSArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJWaXJ0dWFsQXR0cmlidXRlVXRpbHMuc2V0QWNjZXNzS2V5QXR0cmlidXRlKCIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4sIik7Ci0gICAgICBvdXQucHJpbnRsbigidmIsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1swXSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1sxXSArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWaXJ0dWFsQXR0cmlidXRlVXRpbHMuc2V0QWNjZXNzS2V5QXR0cmlidXRlKCIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4sIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wVmFyICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzBdICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzFdICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldE1ldGhvZEJpbmRpbmcoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKwotICAgICAgICAgICJuZXcgTWV0aG9kRXhwcmVzc2lvbk1ldGhvZEJpbmRpbmcoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4gc2lnbmF0dXJlID0gcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpOwotICAgICAgU3RyaW5nW10gcGFyYW1UeXBlcyA9IChzaWduYXR1cmUgIT0gbnVsbCkgPyBzaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKSA6IG51bGw7Ci0KLSAgICAgIFN0cmluZyBjbGFzc0FycmF5OwotCi0gICAgICBpZiAocGFyYW1UeXBlcyA9PSBudWxsIHx8IHBhcmFtVHlwZXMubGVuZ3RoID09IDApCi0gICAgICB7Ci0gICAgICAgIGNsYXNzQXJyYXkgPSAibmV3IENsYXNzWzBdIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoIm5ldyBDbGFzc1tdeyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICBzYi5hcHBlbmQocGFyYW1UeXBlc1tpXSk7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIuY2xhc3MiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0cmFpbGluZyBjb21tYQotICAgICAgICBzYi5hcHBlbmQoJywnKTsKLQotICAgICAgICBzYi5hcHBlbmQoJ30nKTsKLSAgICAgICAgY2xhc3NBcnJheSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotCi0gICAgICBpZiAoaXNTdHJpbmdNZXRob2RCaW5kaW5nUmV0dXJuVHlwZShzaWduYXR1cmUpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiTWV0aG9kQmluZGluZyBtYjsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIm1iID0gY3JlYXRlTWV0aG9kQmluZGluZygiICsgcHJvcFZhciArICIsICIgKyBjbGFzc0FycmF5ICsgIik7Iik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJtYiA9IG5ldyBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIuQ29uc3RhbnRNZXRob2RCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBuZXZlciBhIGxpdGVyYWwsIG5vIG5lZWQgZm9yIENvbnN0YW50TWV0aG9kQmluZGluZwotICAgICAgICBvdXQucHJpbnRsbigiTWV0aG9kQmluZGluZyBtYiA9IGNyZWF0ZU1ldGhvZEJpbmRpbmcoIiArIHByb3BWYXIgKyAiLCAiICsKLSAgICAgICAgICAgIGNsYXNzQXJyYXkgKyAiKTsiKTsKLSAgICAgIH0KLQotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIG1iKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0TWV0aG9kRXhwcmVzc2lvbigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0gICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKwotICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0RW51bSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUV4cHJlc3Npb24oIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgcyA9ICIgKyBwcm9wVmFyICsgIi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHMgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIkVudW0udmFsdWVPZigiICsgcHJvcENsYXNzICsgIi5jbGFzcyxzKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVCaW5kaW5nKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIkVudW0udmFsdWVPZigiICsgcHJvcENsYXNzICsgIi5jbGFzcywiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRLZXlTdHJva2UoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUV4cHJlc3Npb24oIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgdmFsID0gIiArIHByb3BWYXIgKyAiLmdldEV4cHJlc3Npb25TdHJpbmcoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAodmFsICE9IG51bGwpIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJcdEtleVN0cm9rZS5nZXRLZXlTdHJva2UodmFsKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVCaW5kaW5nKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIlx0S2V5U3Ryb2tlLmdldEtleVN0cm9rZSgiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRBV1RLZXlTdHJva2UoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVFeHByZXNzaW9uKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHZhbCA9ICIgKyBwcm9wVmFyICsgIi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHZhbCAhPSBudWxsKSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiXHRBV1RLZXlTdHJva2UuZ2V0QVdUS2V5U3Ryb2tlKHZhbCkpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlQmluZGluZygiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJcdEFXVEtleVN0cm9rZS5nZXRBV1RLZXlTdHJva2UoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0Q29sb3IoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nICBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyAgcHJvcE5hbWUsCi0gICAgICBib29sZWFuIGlzTGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlRXhwcmVzc2lvbigiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyBzID0gIiArIHByb3BWYXIgKyAiLmdldEV4cHJlc3Npb25TdHJpbmcoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAocyAhPSBudWxsKSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIGlmIChpc0xpc3QpCi0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgIFRhZ1V0aWxzLmdldENvbG9yTGlzdChzKSk7Iik7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgIFRhZ1V0aWxzLmdldENvbG9yKHMpKTsiKTsKLSAgICAgIH0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInNldFZhbGlkYXRpb25FcnJvcigiKTsKLSAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlQmluZGluZygiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBpZiAoaXNMaXN0KQotICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICBUYWdVdGlscy5nZXRDb2xvckxpc3QoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgIFRhZ1V0aWxzLmdldENvbG9yKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigic2V0VmFsaWRhdGlvbkVycm9yKCIpOwotICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0Q29udmVydGVyKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlRXhwcmVzc2lvbigiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyBzID0gIiArIHByb3BWYXIgKyAiLmdldEV4cHJlc3Npb25TdHJpbmcoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAocyAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLQotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRGYWNlc0NvbnRleHQoKS5nZXRBcHBsaWNhdGlvbigpLiIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNyZWF0ZUNvbnZlcnRlcihzKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIGNvbnZlcnRlcik7Iik7Ci0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVCaW5kaW5nKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0RmFjZXNDb250ZXh0KCkuZ2V0QXBwbGljYXRpb24oKS4iKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjcmVhdGVDb252ZXJ0ZXIoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIGNvbnZlcnRlcik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNTdHJpbmdNZXRob2RCaW5kaW5nUmV0dXJuVHlwZSgKLSAgICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4gc2lnKQotICB7Ci0gICAgcmV0dXJuIChzaWcgIT0gbnVsbCAmJiAiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHNpZy5nZXRSZXR1cm5UeXBlKCkpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZENvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwN2U5YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZENvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db252ZXJ0ZXJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29udmVydGVyVGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IgewotCi0gIHB1YmxpYyBUcmluaWRhZENvbnZlcnRlclRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIsIFN0cmluZyBsaWNlbnNlSGVhZGVyLCBMb2cgbG9nKSB7Ci0gICAgc3VwZXIoaXMxMiwgbGljZW5zZUhlYWRlciwgbG9nKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTZXQgY3JlYXRlSW1wb3J0cyhDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikgewotICAgIFNldCBpbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5Db252ZXJ0ZXJFTFRhZyIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Iik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuQ29udmVydGVyVGFnIik7Ci0gICAgfQotCi0gICAgaW1wb3J0cy5hZGQoImphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiIpOwotICAgIGltcG9ydHMuYWRkKGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlciIpOwotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgIH0KLSAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLnV0aWwuVGFnVXRpbHMiKTsKLQotCi0gICAgYWRkSW1wb3J0c0Zyb21Qcm9wZXJ0ZXMoY29udmVydGVyLCBpbXBvcnRzKTsKLSAgICByZXR1cm4gaW1wb3J0czsKLSAgfQotCi0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlU2V0UHJvcGVydHkoCi0gICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotCi0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLnNldFZhbHVlRXhwcmVzc2lvbihcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsKLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIi5nZXRWYWx1ZShudWxsKSk7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChUYWdVdGlscy5pc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IFRhZ1V0aWxzLmdldFZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci5zZXRWYWx1ZUJpbmRpbmcoXCIiICsgcHJvcE5hbWUgKyAiXCIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOwotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkVmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGI3YmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRvclRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yIHsKLQotICBwdWJsaWMgVHJpbmlkYWRWYWxpZGF0b3JUYWdHZW5lcmF0b3IoYm9vbGVhbiBfaXMxMiwgU3RyaW5nIF9saWNlbnNlSGVhZGVyLCBMb2cgX2xvZykgewotICAgIHN1cGVyKF9pczEyLCBfbGljZW5zZUhlYWRlciwgX2xvZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2V0IGNyZWF0ZUltcG9ydHMoVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpIHsKLSAgICBTZXQgaW1wb3J0cyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuVmFsaWRhdG9yRUxUYWciKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dCIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLlZhbGlkYXRvclRhZyIpOwotICAgIH0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uIik7Ci0gICAgaW1wb3J0cy5hZGQodmFsaWRhdG9yLmdldFZhbGlkYXRvckNsYXNzKCkpOwotCi0gICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IiKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgIH0KLSAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLnV0aWwuVGFnVXRpbHMiKTsKLQotCi0gICAgYWRkSW1wb3J0c0Zyb21Qcm9wZXJ0ZXModmFsaWRhdG9yLCBpbXBvcnRzKTsKLSAgICByZXR1cm4gaW1wb3J0czsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlU2V0UHJvcGVydHkoCi0gICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3Iuc2V0VmFsdWVFeHByZXNzaW9uKFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IG51bGw7Ci0gICAgICBpZiAoIkRhdGUiLmVxdWFscyAocHJvcENsYXNzKSkgCi0gICAgICB7Ci0gICAgICAgIHByb3BUeXBlID0gcmVzb2x2ZURhdGVUeXBlKHByb3BGdWxsQ2xhc3MsIHByb3BlcnR5LmdldFVzZU1heFRpbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOyAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiLmdldFZhbHVlKG51bGwpKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKFRhZ1V0aWxzLmlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gVGFnVXRpbHMuZ2V0VmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLnNldFZhbHVlQmluZGluZyhcIiIgKyBwcm9wTmFtZSArICJcIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gbnVsbDsKLSAgICAgIGlmICgiRGF0ZSIuZXF1YWxzIChwcm9wQ2xhc3MpKSAKLSAgICAgIHsKLSAgICAgICAgcHJvcFR5cGUgPSByZXNvbHZlRGF0ZVR5cGUocHJvcEZ1bGxDbGFzcywgcHJvcGVydHkuZ2V0VXNlTWF4VGltZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2lvL1ByZXR0eVdyaXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2lvL1ByZXR0eVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWRmNjNjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9pby9QcmV0dHlXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW87Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgUHJldHR5V3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIKLXsKLSAgcHVibGljIFByZXR0eVdyaXRlcigKLSAgICBPdXRwdXRTdHJlYW0gb3V0KQotICB7Ci0gICAgc3VwZXIob3V0KTsKLSAgfQotCi0gIHB1YmxpYyBQcmV0dHlXcml0ZXIoCi0gICAgT3V0cHV0U3RyZWFtIG91dCwKLSAgICBib29sZWFuICAgICAgYXV0b0ZsdXNoKQotICB7Ci0gICAgc3VwZXIob3V0LCBhdXRvRmx1c2gpOwotICB9Ci0KLSAgcHVibGljIFByZXR0eVdyaXRlcigKLSAgICBXcml0ZXIgb3V0KQotICB7Ci0gICAgc3VwZXIob3V0KTsKLSAgfQotCi0gIHB1YmxpYyBQcmV0dHlXcml0ZXIoCi0gICAgV3JpdGVyICBvdXQsCi0gICAgYm9vbGVhbiBhdXRvRmx1c2gpCi0gIHsKLSAgICBzdXBlcihvdXQsIGF1dG9GbHVzaCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbmRlbnQoKQotICB7Ci0gICAgX2luZGVudGF0aW9uICsrOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5pbmRlbnQoKQotICB7Ci0gICAgX2luZGVudGF0aW9uIC0tOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGUoCi0gICAgU3RyaW5nIHN0cmluZywKLSAgICBpbnQgICAgb2Zmc2V0LAotICAgIGludCAgICBsZW5ndGgpCi0gIHsKLSAgICBpZiAoX3VubGF0Y2hQZW5kaW5nKCkpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgX2luZGVudGF0aW9uOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLndyaXRlKF9UQUJfSU5ERU5ULCAwLCAyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdXBlci53cml0ZShzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlKAotICAgIGNoYXJbXSBjaGFycywKLSAgICBpbnQgICAgb2Zmc2V0LAotICAgIGludCAgICBsZW5ndGgpCi0gIHsKLSAgICBpZiAoX3VubGF0Y2hQZW5kaW5nKCkpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgX2luZGVudGF0aW9uOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLndyaXRlKF9UQUJfSU5ERU5UX0NIQVJTLCAwLCAyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdXBlci53cml0ZShjaGFycywgb2Zmc2V0LCBsZW5ndGgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBib29sZWFuIHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgY2hhciB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIGludCB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIGxvbmcgeCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBmbG9hdCB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIGRvdWJsZSB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIGNoYXJbXSB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIFN0cmluZyB4KQotICB7Ci0gICAgaW50IGZyb21JbmRleCA9IDA7Ci0gICAgZm9yIChpbnQgaW5kZXggPSB4LmluZGV4T2YoJ1xuJyk7Ci0gICAgICAgICBpbmRleCAhPSAtMSAgJiYgaW5kZXggKyAxIDwgeC5sZW5ndGgoKTsKLSAgICAgICAgIGZyb21JbmRleCA9IGluZGV4ICsgMSwKLSAgICAgICAgIGluZGV4ID0geC5pbmRleE9mKCdcbicsIGZyb21JbmRleCkpCi0gICAgewotICAgICAgc3VwZXIucHJpbnRsbih4LnN1YnN0cmluZyhmcm9tSW5kZXgsIGluZGV4KSk7Ci0gICAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gICAgfQotCi0gICAgc3VwZXIucHJpbnRsbih4LnN1YnN0cmluZyhmcm9tSW5kZXgpKTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIE9iamVjdCB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX3VubGF0Y2hQZW5kaW5nKCkKLSAgewotICAgIGJvb2xlYW4gcGVuZGluZyA9IF9wZW5kaW5nOwotICAgIGlmIChwZW5kaW5nKQotICAgIHsKLSAgICAgIF9wZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBlbmRpbmc7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX2xhdGNoUGVuZGluZygpCi0gIHsKLSAgICBib29sZWFuIHBlbmRpbmcgPSBfcGVuZGluZzsKLSAgICBpZiAoIXBlbmRpbmcpCi0gICAgewotICAgICAgX3BlbmRpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiAhcGVuZGluZzsKLSAgfQotCi0gIHByaXZhdGUgaW50IF9pbmRlbnRhdGlvbjsKLSAgcHJpdmF0ZSBib29sZWFuIF9wZW5kaW5nID0gdHJ1ZTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1RBQl9JTkRFTlQgPSAiICAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gX1RBQl9JTkRFTlRfQ0hBUlMgPSBfVEFCX0lOREVOVC50b0NoYXJBcnJheSgpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0Fic3RyYWN0VGFnQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0Fic3RyYWN0VGFnQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGM2ZmQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9BYnN0cmFjdFRhZ0JlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUYWdCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbiB7Ci0gIHByaXZhdGUgU3RyaW5nICBfZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nICBfbG9uZ0Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFFOYW1lICAgX3RhZ05hbWU7Ci0gIHByaXZhdGUgU3RyaW5nICBfdGFnQ2xhc3M7Ci0gIHByb3RlY3RlZCBNYXAgX3Byb3BlcnRpZXM7Ci0gIHByaXZhdGUgaW50ICAgICBfdGFnQ2xhc3NNb2RpZmllcnM7Ci0KLSAgcHVibGljIEFic3RyYWN0VGFnQmVhbigpIHsKLSAgICBfcHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKAotICAgIFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGxvbmdEZXNjcmlwdGlvbiAgdGhlIGxvbmcgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvbmdEZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKQotICB7Ci0gICAgX2xvbmdEZXNjcmlwdGlvbiA9IGxvbmdEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBsb25nIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2xvbmdEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdGFnQ2xhc3MgIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzKAotICAgIFN0cmluZyB0YWdDbGFzcykKLSAgewotICAgIF90YWdDbGFzcyA9IHRhZ0NsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFnQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF90YWdDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBKU1AgdGFnIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdGFnTmFtZSAgdGhlIEpTUCB0YWcgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFnTmFtZSgKLSAgICAgIFFOYW1lIHRhZ05hbWUpCi0gIHsKLSAgICBfdGFnTmFtZSA9IHRhZ05hbWU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKU1AgdGFnIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSlNQIHRhZyBuYW1lCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0VGFnTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX3RhZ05hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIHByb3BlcnR5IHRvIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHkgIHRoZSBwcm9wZXJ0eSB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KAotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIF9wcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGZvciB0aGlzIHByb3BlcnR5IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eUJlYW4gZmluZFByb3BlcnR5KAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gKFByb3BlcnR5QmVhbilfcHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBwcm9wZXJ0aWVzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBwcm9wZXJ0aWVzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkKLSAgewotICAgIHJldHVybiAhX3Byb3BlcnRpZXMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBwcm9wZXJ0aWVzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIHByb3BlcnRpZXMoKQotICB7Ci0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZVRhZ0NsYXNzTW9kaWZpZXIoCi0gICAgU3RyaW5nIG1vZGlmaWVyKQotICB7Ci0gICAgYWRkVGFnQ2xhc3NNb2RpZmllcihfcGFyc2VNb2RpZmllcihtb2RpZmllcikpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBfcGFyc2VNb2RpZmllcigKLSAgICBTdHJpbmcgdGV4dCkKLSAgewotICAgIGlmICgicHVibGljIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuUFVCTElDOwotICAgIGVsc2UgaWYgKCJwcm90ZWN0ZWQiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5QUk9URUNURUQ7Ci0gICAgZWxzZSBpZiAoInByaXZhdGUiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5QUklWQVRFOwotICAgIGVsc2UgaWYgKCJhYnN0cmFjdCIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLkFCU1RSQUNUOwotICAgIGVsc2UgaWYgKCJmaW5hbCIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLkZJTkFMOwotCi0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIG1vZGlmaWVyOiAiICsgdGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXIgdG8gdGhlIHRhZyBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIG1vZGlmaWVyICB0aGUgbW9kaWZpZXIgdG8gYmUgYWRkZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRhZ0NsYXNzTW9kaWZpZXIoCi0gICAgaW50IG1vZGlmaWVyKQotICB7Ci0gICAgX3RhZ0NsYXNzTW9kaWZpZXJzIHw9IG1vZGlmaWVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdGFnIGNsYXNzLgotICAgKiBCeSBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHRhZyBjbGFzcwotICAgKi8KLSAgcHVibGljIGludCBnZXRUYWdDbGFzc01vZGlmaWVycygpCi0gIHsKLSAgICBpbnQgbW9kaWZpZXJzID0gX3RhZ0NsYXNzTW9kaWZpZXJzOwotCi0gICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLSAgICB7Ci0gICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOwotICAgIH0KLQotICAgIHJldHVybiBtb2RpZmllcnM7Ci0gIH0KLQotIC8qKgotICAqIE51bWJlciBvZiBwcm9wZXJ0aWVzIGZvciB0aGlzIGNvbXBvbmVudAotICAqIEByZXR1cm4gbnVtIG9mIHByb3BlcnRpZXMKLSAgKi8KLSAgcHVibGljIGludCBwcm9wZXJ0aWVzU2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gX3Byb3BlcnRpZXMuc2l6ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQXR0cmlidXRlQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0F0dHJpYnV0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiMzg1NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQXR0cmlidXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEubGFuZy5Db21wYXJhYmxlOwotCi0vKioKLSAqIEF0dHJpYnV0ZUJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29tcG9uZW50IG9yCi0gKiByZW5kZXJlciBhdHRyaWJ1dGUgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbiBpbXBsZW1lbnRzIENvbXBhcmFibGUKLXsKLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lICB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWUoCi0gICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICBfYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9hdHRyaWJ1dGVOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGF0dHJpYnV0ZSBjbGFzcyBmb3IgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVDbGFzcyAgdGhlIGF0dHJpYnV0ZSBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlQ2xhc3MoCi0gICAgU3RyaW5nIGF0dHJpYnV0ZUNsYXNzKQotICB7Ci0gICAgTWF0Y2hlciBtYXRjaGVyID0gX0dFTkVSSUNfVFlQRS5tYXRjaGVyKGF0dHJpYnV0ZUNsYXNzKTsKLQotICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkKLSAgICB7Ci0gICAgICBfYXR0cmlidXRlQ2xhc3MgPSBtYXRjaGVyLmdyb3VwKDEpOwotICAgICAgX2F0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycyA9IG1hdGNoZXIuZ3JvdXAoMikuc3BsaXQoIiwiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIF9hdHRyaWJ1dGVDbGFzcyA9IGF0dHJpYnV0ZUNsYXNzOwotICAgICAgX2F0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycyA9IF9FTVBUWV9BUlJBWTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgcGFyYW1ldGVyaXplZCB0eXBlcyBmb3IgdGhpcyBhdHRyaWJ1dGUKLSAgICogaWYgaXQgdXNlcyBnZW5lcmljcy4KLSAgICoKLSAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgcGFyYW1ldGVyaXplZCB0eXBlcyBmb3IgdGhpcyBhdHRyaWJ1dGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKQotICB7Ci0gICAgcmV0dXJuIF9hdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGNsYXNzIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2F0dHJpYnV0ZUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKAotICAgIFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoCi0gICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKLSAgewotICAgIF9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gX2RlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhbHRlcm5hdGl2ZSBjbGFzcyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGFsdGVybmF0ZUNsYXNzICB0aGUgYWx0ZXJuYXRpdmUgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFsdGVybmF0ZUNsYXNzKAotICAgIFN0cmluZyBhbHRlcm5hdGVDbGFzcykKLSAgewotICAgIF9hbHRlcm5hdGVDbGFzcyA9IGFsdGVybmF0ZUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGFsdGVybmF0aXZlIGNsYXNzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYWx0ZXJuYXRpdmUgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRlQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9hbHRlcm5hdGVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBtZXRob2QgYmluZGluZyBzaWduYXR1cmUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHNpZ25hdHVyZSAgdGhlIG1ldGhvZCBiaW5kaW5nIHNpZ25hdHVyZSBvZiB0aGlzIHByb3BlcnR5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKAotICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4gc2lnbmF0dXJlKQotICB7Ci0gICAgX3NpZ25hdHVyZSA9IHNpZ25hdHVyZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRob2QgYmluZGluZyBzaWduYXR1cmUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbWV0aG9kIGJpbmRpbmcgc2lnbmF0dXJlIG9mIHRoaXMgcHJvcGVydHkKLSAgICovCi0gIHB1YmxpYyBNZXRob2RTaWduYXR1cmVCZWFuIGdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKQotICB7Ci0gICAgcmV0dXJuIF9zaWduYXR1cmU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmlydHVhbCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSB2aXJ0dWFsICB0aGUgcHJvcGVydHkgcmVxdWlyZWQgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmlydHVhbCgKLSAgICBib29sZWFuIHZpcnR1YWwpCi0gIHsKLSAgICBfdmlydHVhbCA9IHZpcnR1YWw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB2aXJ0dWFsIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IHZpcnR1YWwgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkKLSAgewotICAgIHJldHVybiBfdmlydHVhbDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKQotICB7Ci0gICAgaWYobyBpbnN0YW5jZW9mIEF0dHJpYnV0ZUJlYW4pCi0gICAgewotICAgICAgQXR0cmlidXRlQmVhbiBhdHRyID0gKEF0dHJpYnV0ZUJlYW4pbzsKLSAgICAgIHJldHVybiBfYXR0cmlidXRlTmFtZS5jb21wYXJlVG8oYXR0ci5fYXR0cmlidXRlTmFtZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyAgIF9hdHRyaWJ1dGVOYW1lOwotICBwcml2YXRlIFN0cmluZyAgIF9hdHRyaWJ1dGVDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBfYXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzOwotICBwcml2YXRlIFN0cmluZyAgIF9kZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgICBfZGVmYXVsdFZhbHVlOwotICAvLyBGSVhNRTogQWx0ZXJuYXRlIHR5cGUgZG9lcyBub3Qgc2VlbSB0byBzdXBwb3J0IGdlbmVyaWMgdHlwZXMKLSAgcHJpdmF0ZSBTdHJpbmcgICBfYWx0ZXJuYXRlQ2xhc3M7Ci0gIHByaXZhdGUgYm9vbGVhbiAgX3ZpcnR1YWw7Ci0gIHByaXZhdGUgTWV0aG9kU2lnbmF0dXJlQmVhbiBfc2lnbmF0dXJlOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFBhdHRlcm4gX0dFTkVSSUNfVFlQRSA9IFBhdHRlcm4uY29tcGlsZSgiKFtePF0rKTwoLispPiIpOwotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBfRU1QVFlfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0NvbXBvbmVudEJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Db21wb25lbnRCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNmUxZTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0NvbXBvbmVudEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkNvbXBvdW5kSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBDb21wb25lbnRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudAotICogWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBDb21wb25lbnRCZWFuLgotICAgKi8KLSAgcHVibGljIENvbXBvbmVudEJlYW4oKQotICB7Ci0gICAgX3Byb3BlcnRpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIF9mYWNldHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIF9ldmVudHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIFVJWDIgbG9jYWwgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBsb2NhbE5hbWUgIHRoZSBsb2NhbCBuYW1lCi0gICAqCi0gICAqIEBkZXByZWNhdGVkIHJlbW92ZSB3aGVuICJ1aSIgcGFja2FnZSBpcyBnb25lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoCi0gICAgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIF9sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVUlYMiBsb2NhbCBuYW1lIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGxvY2FsIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkKLSAgewotICAgIHJldHVybiBfbG9jYWxOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIFVJWDIgbm9kZSBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlQ2xhc3MgIHRoZSBub2RlIGNsYXNzCi0gICAqCi0gICAqIEBkZXByZWNhdGVkIHJlbW92ZSB3aGVuICJ1aSIgcGFja2FnZSBpcyBnb25lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROb2RlQ2xhc3MoCi0gICAgU3RyaW5nIG5vZGVDbGFzcykKLSAgewotICAgIF9ub2RlQ2xhc3MgPSBub2RlQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVUlYMiBub2RlIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIG5vZGUgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUNsYXNzKCkKLSAgewotICAgIHJldHVybiBfbm9kZUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgIHRoZSBjb21wb25lbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZSgKLSAgICBTdHJpbmcgY29tcG9uZW50VHlwZSkKLSAgewotICAgIF9jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudEZhbWlseSAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEZhbWlseSgKLSAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5KQotICB7Ci0gICAgX2NvbXBvbmVudEZhbWlseSA9IGNvbXBvbmVudEZhbWlseTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50RmFtaWx5KCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50RmFtaWx5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGZhbWlseSBleGlzdHMgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICBpZiB0aGUgY29tcG9uZW50IGZhbWlseSBleGlzdHMsCi0gICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9uZW50RmFtaWx5KCkKLSAgewotICAgIHJldHVybiAoX2NvbXBvbmVudEZhbWlseSAhPSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb21wb25lbnQgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgIHRoZSBjb21wb25lbnQgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudENsYXNzKAotICAgIFN0cmluZyBjb21wb25lbnRDbGFzcykKLSAgewotICAgIF9jb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudENsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50Q2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gbG9uZ0Rlc2NyaXB0aW9uICB0aGUgbG9uZyBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9uZ0Rlc2NyaXB0aW9uKAotICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24pCi0gIHsKLSAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gbG9uZ0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGxvbmcgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfbG9uZ0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB0YWdDbGFzcyAgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFnQ2xhc3MoCi0gICAgU3RyaW5nIHRhZ0NsYXNzKQotICB7Ci0gICAgX3RhZ0NsYXNzID0gdGFnQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkQWdlbnRzICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbnN1cHBvcnRlZEFnZW50cygKLSAgICBTdHJpbmdbXSB1bnN1cHBvcnRlZEFnZW50cykKLSAgewotICAgIGlmICh1bnN1cHBvcnRlZEFnZW50cyA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZEFnZW50cyIpOwotCi0gICAgX3Vuc3VwcG9ydGVkQWdlbnRzID0gdW5zdXBwb3J0ZWRBZ2VudHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKQotICB7Ci0gICAgcmV0dXJuIF91bnN1cHBvcnRlZEFnZW50czsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFnQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF90YWdDbGFzczsKLSAgfQotCi0gICAvKioKLSAgICogU2V0cyB0aGUgSlNQIHRhZyBoYW5kbGVyIHN1cGVyY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdGFnU3VwZXJjbGFzcyAgdGhlIEpTUCB0YWcgaGFuZGxlciBzdXBlcmNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUYWdTdXBlcmNsYXNzKAotICAgIFN0cmluZyB0YWdTdXBlcmNsYXNzKQotICB7Ci0gICAgX3RhZ1N1cGVyY2xhc3MgPSB0YWdTdXBlcmNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpTUCB0YWcgaGFuZGxlciBzdXBlcmNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpTUCB0YWcgaGFuZGxlciBzdXBlcmNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhZ1N1cGVyY2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF90YWdTdXBlcmNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXIgKGNvbXBvbmVudCBoYW5kbGVyKSB0aGlzIGNvbXBvbmVudC4KLSAgKgotICAqIEBwYXJhbSB0YWdIYW5kbGVyIHRoZSBGYWNlbGV0cyB0YWcgaGFuZGxlciBjbGFzcwotICAqLwotIHB1YmxpYyB2b2lkIHNldFRhZ0hhbmRsZXIoCi0gICBTdHJpbmcgdGFnSGFuZGxlcikKLSB7Ci0gICBfdGFnSGFuZGxlciA9IHRhZ0hhbmRsZXI7Ci0gfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXIgZm9yIHRoaXMgY29tcG9uZW50Ci0gICoKLSAgKiBAcmV0dXJuICB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXIKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldFRhZ0hhbmRsZXIoKQotIHsKLSAgIHJldHVybiBfdGFnSGFuZGxlcjsKLSB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpTUCB0YWcgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKU1AgdGFnIG5hbWUKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRUYWdOYW1lKCkKLSAgewotICAgIHJldHVybiBfdGFnTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBKU1AgdGFnIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdGFnTmFtZSAgdGhlIEpTUCB0YWcgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFnTmFtZSgKLSAgICBRTmFtZSB0YWdOYW1lKQotICB7Ci0gICAgX3RhZ05hbWUgPSB0YWdOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWluZ0NvbnRhaW5lciBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1pbmdDb250YWluZXIgIHRoZSBjb21wb25lbnQgbmFtaW5nQ29udGFpbmVyIGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWluZ0NvbnRhaW5lcigKLSAgICBib29sZWFuIG5hbWluZ0NvbnRhaW5lcikKLSAgewotICAgIF9uYW1pbmdDb250YWluZXIgPSBuYW1pbmdDb250YWluZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBuYW1pbmdDb250YWluZXIgZmxhZyBvZiB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBuYW1pbmdDb250YWluZXIgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1pbmdDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1pbmdDb250YWluZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcG9uZW50IHN1cGVydHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRTdXBlcnR5cGUgIHRoZSBjb21wb25lbnQgc3VwZXIgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50U3VwZXJ0eXBlKAotICAgIFN0cmluZyBjb21wb25lbnRTdXBlcnR5cGUpCi0gIHsKLSAgICBfY29tcG9uZW50U3VwZXJ0eXBlID0gY29tcG9uZW50U3VwZXJ0eXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdXBlcnR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHN1cGVydHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRTdXBlcnR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRTdXBlcnR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcG9uZW50IHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudFN1cGVyY2xhc3MgIHRoZSBjb21wb25lbnQgc3VwZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudFN1cGVyY2xhc3MoCi0gICAgU3RyaW5nIGNvbXBvbmVudFN1cGVyY2xhc3MpCi0gIHsKLSAgICBfY29tcG9uZW50U3VwZXJjbGFzcyA9IGNvbXBvbmVudFN1cGVyY2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBzdXBlciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRTdXBlcmNsYXNzKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50U3VwZXJjbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSAgdGhlIHJlbmRlcmVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbmRlcmVyVHlwZSgKLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICB7Ci0gICAgX3JlbmRlcmVyVHlwZSA9IHJlbmRlcmVyVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlcmVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkKLSAgewotICAgIHJldHVybiBfcmVuZGVyZXJUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlZmF1bHQgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBkZWZhdWx0IHJlbmRlcmVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlbmRlcmVyVHlwZSgpCi0gIHsKLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kUmVuZGVyZXJUeXBlKCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9pbXBsZW1lbnRhdGlvblR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblR5cGUoU3RyaW5nIGltcGxlbWVudGF0aW9uVHlwZSkKLSAgewotICAgIF9pbXBsZW1lbnRhdGlvblR5cGUgPSBpbXBsZW1lbnRhdGlvblR5cGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBBZGRzIGEgcHJvcGVydHkgdG8gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSAgdGhlIHByb3BlcnR5IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgX3Byb3BlcnRpZXMucHV0KHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLCBwcm9wZXJ0eSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZm9yIHRoaXMgcHJvcGVydHkgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgdGhlIHByb3BlcnR5IG5hbWUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIFByb3BlcnR5QmVhbiBmaW5kUHJvcGVydHkoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiAoUHJvcGVydHlCZWFuKV9wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGZvciB0aGlzIHByb3BlcnR5IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eUJlYW4gZmluZFByb3BlcnR5KAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgUHJvcGVydHlCZWFuIHByb3AgPSBmaW5kUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICBpZiAocHJvcCA9PSBudWxsICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHByb3AgPSBwYXJlbnQuZmluZFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZmxhdHRlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByb3A7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBwcm9wZXJ0aWVzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBwcm9wZXJ0aWVzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkKLSAgewotICAgIHJldHVybiBoYXNQcm9wZXJ0aWVzKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IGNvbXBvbmVudCBzdXBlcnR5cGUKLSAgICogaGFzIGFueSBwcm9wZXJ0aWVzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IHN1cGVydHlwZSBoYXMgYW55IHByb3BlcnRpZXMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzID0gIV9wcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQotICAgIGlmICghaGFzUHJvcGVydGllcyAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBoYXNQcm9wZXJ0aWVzIHw9IHBhcmVudC5oYXNQcm9wZXJ0aWVzKGZsYXR0ZW4pOwotICAgIH0KLQotICAgIHJldHVybiBoYXNQcm9wZXJ0aWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBwcm9wZXJ0aWVzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIHByb3BlcnRpZXMoKQotICB7Ci0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgcHJvcGVydGllcyBvbiB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBzdXBlcnR5cGUsCi0gICAqICAgICAgICAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIHByb3BlcnRpZXMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IHByb3BlcnRpZXMoKTsKLSAgICBpZiAoZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgcHJvcGVydGllcyA9IG5ldyBDb21wb3VuZEl0ZXJhdG9yKHBhcmVudC5wcm9wZXJ0aWVzKHRydWUpLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLQotIC8qKgotICAqIE51bWJlciBvZiBwcm9wZXJ0aWVzIGZvciB0aGlzIGNvbXBvbmVudAotICAqIEByZXR1cm4gbnVtIG9mIHByb3BlcnRpZXMKLSAgKi8KLSAgcHVibGljIGludCBwcm9wZXJ0aWVzU2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gX3Byb3BlcnRpZXMuc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBmYWNldCB0byB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGZhY2V0ICB0aGUgZmFjZXQgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRGYWNldCgKLSAgICBGYWNldEJlYW4gZmFjZXQpCi0gIHsKLSAgICBfZmFjZXRzLnB1dChmYWNldC5nZXRGYWNldE5hbWUoKSwgZmFjZXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZhY2V0IGZvciB0aGlzIGZhY2V0IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBmYWNldE5hbWUgIHRoZSBmYWNldCBuYW1lIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBGYWNldEJlYW4gZmluZEZhY2V0KAotICAgIFN0cmluZyBmYWNldE5hbWUpCi0gIHsKLSAgICByZXR1cm4gKEZhY2V0QmVhbilfZmFjZXRzLmdldChmYWNldE5hbWUpOwotICB9Ci0KLQotICBwdWJsaWMgRmFjZXRCZWFuIGZpbmRGYWNldCgKLSAgICBTdHJpbmcgZmFjZXROYW1lLAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIEZhY2V0QmVhbiBmYWNldCA9IGZpbmRGYWNldChmYWNldE5hbWUpOwotICAgIGlmIChmYWNldCA9PSBudWxsICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIGZhY2V0ID0gcGFyZW50LmZpbmRGYWNldChmYWNldE5hbWUsIGZsYXR0ZW4pOwotICAgIH0KLQotICAgIHJldHVybiBmYWNldDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBmYWNldHMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGZhY2V0cywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRmFjZXRzKCkKLSAgewotICAgIHJldHVybiBoYXNGYWNldHMoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgY29tcG9uZW50IHN1cGVydHlwZQotICAgKiBoYXMgYW55IGZhY2V0cy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBmYWNldHMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZhY2V0cygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBib29sZWFuIGhhc0ZhY2V0cyA9ICFfZmFjZXRzLmlzRW1wdHkoKTsKLQotICAgIGlmICghaGFzRmFjZXRzICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIGhhc0ZhY2V0cyB8PSBwYXJlbnQuaGFzRmFjZXRzKGZsYXR0ZW4pOwotICAgIH0KLQotICAgIHJldHVybiBoYXNGYWNldHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGZhY2V0cyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBmYWNldHMoKQotICB7Ci0gICAgcmV0dXJuIF9mYWNldHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBmYWNldHMgb24gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZgotICAqICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLAotICAqICAgICAgICAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICoKLSAgKiBAcmV0dXJuICB0aGUgZmFjZXQgaXRlcmF0b3IKLSAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGZhY2V0cygKLSAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIEl0ZXJhdG9yIGZhY2V0cyA9IGZhY2V0cygpOwotICAgIGlmIChmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBmYWNldHMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihmYWNldHMsIHBhcmVudC5mYWNldHModHJ1ZSkpOwotICAgIH0KLSAgICByZXR1cm4gZmFjZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNwZWNpZmllcyBpZiB0aGUgY29tcG9uZW50IGNhbiBoYXZlIGNoaWxkcmVuLgotICAgKgotICAgKiBAcGFyYW0gY2hpbGRyZW4gIHRydWUgIGlmIHRoZSBjb21wb25lbnQgY2FuIGhhdmUgY2hpbGRyZW4uCi0gICAqICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbigKLSAgICBib29sZWFuIGNoaWxkcmVuKQotICB7Ci0gICAgX2NoaWxkcmVuID0gY2hpbGRyZW47Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBjYW4gaGF2ZSBjaGlsZHJlbi4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgaWYgdGhlIGNvbXBvbmVudCBjYW4gaGF2ZSBjaGlsZHJlbi4KLSAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gX2NoaWxkcmVuOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVyIHRvIHRoZSBjb21wb25lbnQgY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RpZmllciAgdGhlIG1vZGlmaWVyIHRvIGJlIGFkZGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRDbGFzc01vZGlmaWVyKAotICAgIGludCBtb2RpZmllcikKLSAgewotICAgIF9jb21wb25lbnRDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIGNvbXBvbmVudCBjbGFzcy4KLSAgICogQnkgZGVmYXVsdCwgdGhlc2UgbW9kaWZpZXJzIGluY2x1ZGUgTW9kaWZpZXIuUFVCTElDLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBjb21wb25lbnQgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50Q2xhc3NNb2RpZmllcnMoKQotICB7Ci0gICAgaW50IG1vZGlmaWVycyA9IF9jb21wb25lbnRDbGFzc01vZGlmaWVyczsKLQotICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0gICAgewotICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kaWZpZXJzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFyc2VDb21wb25lbnRDbGFzc01vZGlmaWVyKAotICAgIFN0cmluZyBtb2RpZmllcikKLSAgewotICAgIGFkZENvbXBvbmVudENsYXNzTW9kaWZpZXIoX3BhcnNlTW9kaWZpZXIobW9kaWZpZXIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlVGFnQ2xhc3NNb2RpZmllcigKLSAgICBTdHJpbmcgbW9kaWZpZXIpCi0gIHsKLSAgICBhZGRUYWdDbGFzc01vZGlmaWVyKF9wYXJzZU1vZGlmaWVyKG1vZGlmaWVyKSk7Ci0gIH0KLQotICBwcml2YXRlIGludCBfcGFyc2VNb2RpZmllcigKLSAgICBTdHJpbmcgdGV4dCkKLSAgewotICAgIGlmICgicHVibGljIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuUFVCTElDOwotICAgIGVsc2UgaWYgKCJwcm90ZWN0ZWQiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5QUk9URUNURUQ7Ci0gICAgZWxzZSBpZiAoInByaXZhdGUiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5QUklWQVRFOwotICAgIGVsc2UgaWYgKCJhYnN0cmFjdCIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLkFCU1RSQUNUOwotICAgIGVsc2UgaWYgKCJmaW5hbCIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLkZJTkFMOwotCi0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIG1vZGlmaWVyOiAiICsgdGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgY29tcG9uZW50IGludG8gYSBTdHJpbmcgYXJyYXkKLSAgICogdXNpbmcgc3BhY2UgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcy4KLSAgICoKLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkQWdlbnRzICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVVuc3VwcG9ydGVkQWdlbnRzKAotICAgIFN0cmluZyB1bnN1cHBvcnRlZEFnZW50cykKLSAgewotICAgIHNldFVuc3VwcG9ydGVkQWdlbnRzKHVuc3VwcG9ydGVkQWdlbnRzLnNwbGl0KCIgIikpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkcyBhIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXIgdG8gdGhlIHRhZyBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIG1vZGlmaWVyICB0aGUgbW9kaWZpZXIgdG8gYmUgYWRkZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRhZ0NsYXNzTW9kaWZpZXIoCi0gICAgaW50IG1vZGlmaWVyKQotICB7Ci0gICAgX3RhZ0NsYXNzTW9kaWZpZXJzIHw9IG1vZGlmaWVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdGFnIGNsYXNzLgotICAgKiBCeSBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHRhZyBjbGFzcwotICAgKi8KLSAgcHVibGljIGludCBnZXRUYWdDbGFzc01vZGlmaWVycygpCi0gIHsKLSAgICBpbnQgbW9kaWZpZXJzID0gX3RhZ0NsYXNzTW9kaWZpZXJzOwotCi0gICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLSAgICB7Ci0gICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOwotICAgIH0KLQotICAgIHJldHVybiBtb2RpZmllcnM7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhbiBldmVudCB0byB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50UmVmICB0aGUgZXZlbnQgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFdmVudCgKLSAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYpCi0gIHsKLSAgICBpZiAoZXZlbnRSZWYuZ2V0RXZlbnRUeXBlKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfTE9HLndhcm5pbmcoIk1pc3NpbmcgZXZlbnQgdHlwZSBpbiBjb21wb25lbnQgXCIiICsKLSAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50VHlwZSArICJcIiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgX2V2ZW50cy5wdXQoZXZlbnRSZWYuZ2V0RXZlbnRUeXBlKCksIGV2ZW50UmVmKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZXZlbnRzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBldmVudHMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0V2ZW50cygpCi0gIHsKLSAgICByZXR1cm4gaGFzRXZlbnRzKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IGNvbXBvbmVudCBzdXBlcnR5cGUKLSAgICogaGFzIGFueSBldmVudHMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgc3VwZXJ0eXBlIGhhcyBhbnkgZXZlbnRzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFdmVudHMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgYm9vbGVhbiBoYXNFdmVudHMgPSAhX2V2ZW50cy5pc0VtcHR5KCk7Ci0KLSAgICBpZiAoIWhhc0V2ZW50cyAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBoYXNFdmVudHMgfD0gcGFyZW50Lmhhc0V2ZW50cyhmbGF0dGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFzRXZlbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IGZvciB0aGlzIGV2ZW50IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudE5hbWUgIHRoZSBldmVudCBuYW1lIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBFdmVudEJlYW4gZmluZEV2ZW50KAotICAgIFN0cmluZyBldmVudE5hbWUpCi0gIHsKLSAgICByZXR1cm4gKEV2ZW50QmVhbilfZXZlbnRzLmdldChldmVudE5hbWUpOwotICB9Ci0KLSAgcHVibGljIEV2ZW50QmVhbiBmaW5kRXZlbnQoCi0gICAgU3RyaW5nIGV2ZW50TmFtZSwKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBFdmVudEJlYW4gZXZlbnQgPSBmaW5kRXZlbnQoZXZlbnROYW1lKTsKLSAgICBpZiAoZXZlbnQgPT0gbnVsbCAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBldmVudCA9IHBhcmVudC5maW5kRXZlbnQoZXZlbnROYW1lLCBmbGF0dGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXZlbnQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgZXZlbnRzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGV2ZW50cygpCi0gIHsKLSAgICByZXR1cm4gX2V2ZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGV2ZW50cyBvbiB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgKiBAcGFyYW0gZmxhdHRlbiAgdHJ1ZSAgIGlmIHRoZSBpdGVyYXRvciBzaG91bGQgYmUgYSBjb21iaW5lZCBsaXN0IG9mCi0gICogICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgb2YgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBzdXBlcnR5cGUsCi0gICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgKgotICAqIEByZXR1cm4gIHRoZSBldmVudCBpdGVyYXRvcgotICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZXZlbnRzKAotICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgSXRlcmF0b3IgZXZlbnRzID0gZXZlbnRzKCk7Ci0gICAgaWYgKGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIGV2ZW50cyA9IG5ldyBDb21wb3VuZEl0ZXJhdG9yKGV2ZW50cywgcGFyZW50LmV2ZW50cyh0cnVlKSk7Ci0gICAgfQotICAgIHJldHVybiBldmVudHM7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQotICAgKiBoaWVyYXJjaHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgZmFtaWx5Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZpbmRDb21wb25lbnRGYW1pbHkoKQotICB7Ci0gICAgaWYgKF9jb21wb25lbnRGYW1pbHkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBfY29tcG9uZW50RmFtaWx5OwotCi0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZENvbXBvbmVudEZhbWlseSgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgYmVoYXZpb3JhbCBjb21wb25lbnQgY29tcG9uZW50IGluaGVyaXRhbmNlCi0gICAqIGhpZXJhcmNoeS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGJlaGF2aW9yYWwgY29tcG9uZW50Ci0gICAqLwotICBwdWJsaWMgQ29tcG9uZW50QmVhbiBmaW5kQmVoYXZpb3JhbENvbXBvbmVudCgpCi0gIHsKLSAgICBpZiAoX2NvbXBvbmVudEZhbWlseSAhPSBudWxsKQotICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKGNvbXBvbmVudCAhPSBudWxsKSA/IGNvbXBvbmVudC5maW5kQmVoYXZpb3JhbENvbXBvbmVudCgpIDogdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgcmVuZGVyZXIgdHlwZSBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlCi0gICAqIGhpZXJhcmNoeS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlcmVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmluZFJlbmRlcmVyVHlwZSgpCi0gIHsKLSAgICBpZiAoX3JlbmRlcmVyVHlwZSAhPSBudWxsKQotICAgICAgcmV0dXJuIF9yZW5kZXJlclR5cGU7Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kUmVuZGVyZXJUeXBlKCkgOiBudWxsOwotICB9Ci0KLQotICAvKioKLSAgICogRmluZHMgdGhlIGNvbXBvbmVudCBzdXBlcmNsYXNzIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UKLSAgICogaGllcmFyY2h5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHN1cGVyY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmluZENvbXBvbmVudFN1cGVyY2xhc3MoKQotICB7Ci0gICAgaWYgKF9jb21wb25lbnRTdXBlcmNsYXNzICE9IG51bGwpCi0gICAgICByZXR1cm4gX2NvbXBvbmVudFN1cGVyY2xhc3M7Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kQ29tcG9uZW50Q2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGlzVHJpbmlkYWRDb21wb25lbnQoKSA/IAotICAgICAgICAgICAgICAgICAgIF9UUklOSURBRF9DT01QT05FTlRfQkFTRSA6IF9KU0ZfQ09NUE9ORU5UX0JBU0UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSB0YWcgc3VwZXJjbGFzcyBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlCi0gICAqIGhpZXJhcmNoeS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHRhZyBzdXBlcmNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZpbmRKc3BUYWdTdXBlcmNsYXNzKCkKLSAgewotICAgIGlmIChfdGFnU3VwZXJjbGFzcyAhPSBudWxsKQotICAgICAgcmV0dXJuIF90YWdTdXBlcmNsYXNzOwotCi0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZEpzcFRhZ0NsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpc1RyaW5pZGFkQ29tcG9uZW50KCkgPwotICAgICAgICAgICAgICAgICAgX1RSSU5JREFEX0NPTVBPTkVOVF9UQUcgOiBfSlNGX0NPTVBPTkVOVF9UQUcpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdXBlcnR5cGUgaW5zdGFuY2UuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlIGluc3RhbmNlCi0gICAqLwotICBwdWJsaWMgQ29tcG9uZW50QmVhbiByZXNvbHZlU3VwZXJ0eXBlKCkKLSAgewotICAgIGlmIChfY29tcG9uZW50U3VwZXJ0eXBlID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lciA9IGdldE93bmVyKCk7Ci0gICAgcmV0dXJuIChvd25lciAhPSBudWxsKSA/IG93bmVyLmZpbmRDb21wb25lbnQoX2NvbXBvbmVudFN1cGVydHlwZSkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyBpZiBhbnkgb2YgdGhlIGNvbXBvbmVudCBzdXBlcmNsYXNzZXMgaXMgVUlYQ29tcG9uZW50QmFzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNUcmluaWRhZENvbXBvbmVudCgpCi0gIHsKLSAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25UeXBlID0gZ2V0SW1wbGVtZW50YXRpb25UeXBlKCk7Ci0gICAgaWYgKGltcGxlbWVudGF0aW9uVHlwZSAhPSBudWxsKQotICAgICAgcmV0dXJuICJ0cmluaWRhZCIuZXF1YWxzKGltcGxlbWVudGF0aW9uVHlwZSk7Ci0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudFN1cGVydHlwZSA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICBpZiAoY29tcG9uZW50U3VwZXJ0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKF9UUklOSURBRF9DT01QT05FTlRfQkFTRS5lcXVhbHMoY29tcG9uZW50U3VwZXJ0eXBlLmdldENvbXBvbmVudENsYXNzKCkpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudFN1cGVydHlwZS5pc1RyaW5pZGFkQ29tcG9uZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgY29tcG9uZW50IGNsYXNzIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UKLSAgICogaGllcmFyY2h5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmRDb21wb25lbnRDbGFzcygpCi0gIHsKLSAgICBpZiAoX2NvbXBvbmVudENsYXNzICE9IG51bGwpCi0gICAgICByZXR1cm4gX2NvbXBvbmVudENsYXNzOwotCi0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZENvbXBvbmVudENsYXNzKCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSB0YWcgY2xhc3MgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQotICAgKiBoaWVyYXJjaHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB0YWcgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZmluZEpzcFRhZ0NsYXNzKCkKLSAgewotICAgIGlmIChfdGFnQ2xhc3MgIT0gbnVsbCkKLSAgICAgIHJldHVybiBfdGFnQ2xhc3M7Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kSnNwVGFnQ2xhc3MoKSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQXR0YWNoZXMgdGhlIGNvbXBvbmVudCBhbmQgYWxsIGV2ZW50IHJlZmVyZW5jZXMuCi0gICAqCi0gICAqIEBwYXJhbSBvd25lciAgdGhlIGZhY2VzIGNvbmZpZyBvd25lcgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoKAotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lcikKLSAgewotICAgIHN1cGVyLmF0dGFjaChvd25lcik7Ci0gICAgSXRlcmF0b3IgZXZlbnRzID0gZXZlbnRzKGZhbHNlKTsKLSAgICB3aGlsZSAoZXZlbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKWV2ZW50cy5uZXh0KCk7Ci0gICAgICBldmVudFJlZi5hdHRhY2gob3duZXIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudENsYXNzRXhjbHVkZWQoYm9vbGVhbiBjb21wb25lbnRDbGFzc0V4Y2x1ZGVkKQotICB7Ci0gICAgX2NvbXBvbmVudENsYXNzRXhjbHVkZWQgPSBjb21wb25lbnRDbGFzc0V4Y2x1ZGVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb21wb25lbnRDbGFzc0V4Y2x1ZGVkKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50Q2xhc3NFeGNsdWRlZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGFnQ2xhc3NFeGNsdWRlZChib29sZWFuIHRhZ0NsYXNzRXhjbHVkZWQpCi0gIHsKLSAgICBfdGFnQ2xhc3NFeGNsdWRlZCA9IHRhZ0NsYXNzRXhjbHVkZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1RhZ0NsYXNzRXhjbHVkZWQoKQotICB7Ci0gICAgcmV0dXJuIF90YWdDbGFzc0V4Y2x1ZGVkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50SW1wbGVtZW50cyhTdHJpbmcgY29tcG9uZW50SW1wbGVtZW50cykKLSAgewotICAgIHRoaXMuX2NvbXBvbmVudEltcGxlbWVudHMgPSBjb21wb25lbnRJbXBsZW1lbnRzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRJbXBsZW1lbnRzKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50SW1wbGVtZW50czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudFNlcmlhbFVJRChTdHJpbmcgY29tcG9uZW50U2VyaWFsVUlEKQotICB7Ci0gICAgdGhpcy5fY29tcG9uZW50U2VyaWFsVUlEID0gY29tcG9uZW50U2VyaWFsVUlEOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRTZXJpYWxVSUQoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRTZXJpYWxVSUQ7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfY29tcG9uZW50U2VyaWFsVUlEOwotICBwcml2YXRlIFN0cmluZyBfY29tcG9uZW50SW1wbGVtZW50czsKLSAgcHJpdmF0ZSBib29sZWFuIF90YWdDbGFzc0V4Y2x1ZGVkOwotICBwcml2YXRlIGJvb2xlYW4gX2NvbXBvbmVudENsYXNzRXhjbHVkZWQ7ICAKLSAgcHJpdmF0ZSBTdHJpbmcgIF9kZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9sb25nRGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nICBfY29tcG9uZW50VHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRGYW1pbHk7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29tcG9uZW50Q2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29tcG9uZW50U3VwZXJ0eXBlOwotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudFN1cGVyY2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfcmVuZGVyZXJUeXBlOwotICBwcml2YXRlIFN0cmluZyAgX2ltcGxlbWVudGF0aW9uVHlwZTsKLSAgcHJpdmF0ZSBRTmFtZSAgIF90YWdOYW1lOwotICBwcml2YXRlIFN0cmluZyAgX3RhZ0NsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX3RhZ0hhbmRsZXI7Ci0gIHByaXZhdGUgU3RyaW5nICBfdGFnU3VwZXJjbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9sb2NhbE5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nICBfbm9kZUNsYXNzOwotICBwcml2YXRlIGJvb2xlYW4gX25hbWluZ0NvbnRhaW5lcjsKLSAgcHJpdmF0ZSBib29sZWFuIF9jaGlsZHJlbiA9IHRydWU7Ci0gIHByaXZhdGUgTWFwICAgICBfcHJvcGVydGllczsKLSAgcHJpdmF0ZSBNYXAgICAgIF9mYWNldHM7Ci0gIHByaXZhdGUgTWFwICAgICBfZXZlbnRzOwotICBwcml2YXRlIGludCAgICAgX2NvbXBvbmVudENsYXNzTW9kaWZpZXJzOwotICBwcml2YXRlIGludCAgICAgX3RhZ0NsYXNzTW9kaWZpZXJzOwotICBwcml2YXRlIFN0cmluZ1tdIF91bnN1cHBvcnRlZEFnZW50cyA9IG5ldyBTdHJpbmdbMF07Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9UUklOSURBRF9DT01QT05FTlRfQkFTRSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuVUlYQ29tcG9uZW50QmFzZSI7Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9UUklOSURBRF9DT01QT05FTlRfVEFHID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5VSVhDb21wb25lbnRUYWciOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfSlNGX0NPTVBPTkVOVF9CQVNFID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50QmFzZSI7Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9KU0ZfQ09NUE9ORU5UX1RBRyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudFRhZyI7Ci0gIAotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ29tcG9uZW50QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0NvbnZlcnRlckJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Db252ZXJ0ZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjUxZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0NvbnZlcnRlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQ29udmVydGVyQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb252ZXJ0ZXIKLSAqIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyQmVhbiBleHRlbmRzIEFic3RyYWN0VGFnQmVhbgotewotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb252ZXJ0ZXIgaWRlbnRpZmVyIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbnZlcnRlcklkICBjb252ZXJ0ZXIgaWRlbnRpZmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJJZCgKLSAgICBTdHJpbmcgY29udmVydGVySWQpCi0gIHsKLSAgICBfY29udmVydGVySWQgPSBjb252ZXJ0ZXJJZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnZlcnRlciBpZGVudGlmaWVyIGlzIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGZhbHNlLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjb252ZXJ0ZXIgaWRlbnRpZmllciBpcyBzcGVjaWZpZWQsCi0gICAqICAgICAgICAgIG90aGVyd2lzZSBmYWxzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NvbnZlcnRlcklkKCkKLSAgewotICAgIHJldHVybiAoX2NvbnZlcnRlcklkICE9IG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbnZlcnRlciBpZGVudGlmaWVyIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbnZlcnRlciBpZGVudGlmaWVyCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlcklkKCkKLSAgewotICAgIHJldHVybiBfY29udmVydGVySWQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29udmVydGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbnZlcnRlckNsYXNzICB0aGUgY29udmVydGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcygKLSAgICBTdHJpbmcgY29udmVydGVyQ2xhc3MpCi0gIHsKLSAgICBfY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29udmVydGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkKLSAgewotICAgIHJldHVybiBfY29udmVydGVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29udmVydGVyIHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbnZlcnRlclN1cGVyQ2xhc3MgIHRoZSBjb252ZXJ0ZXIgc3VwZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlclN1cGVyQ2xhc3MoCi0gICAgU3RyaW5nIGNvbnZlcnRlclN1cGVyQ2xhc3MpCi0gIHsKLSAgICBfY29udmVydGVyU3VwZXJDbGFzcyA9IGNvbnZlcnRlclN1cGVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29udmVydGVyIHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbnZlcnRlciBzdXBlciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJTdXBlckNsYXNzKCkKLSAgewotICAgIHJldHVybiBfY29udmVydGVyU3VwZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgY29udmVydGVyIGNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gbW9kaWZpZXIgIHRoZSBtb2RpZmllciB0byBiZSBhZGRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29udmVydGVyQ2xhc3NNb2RpZmllcigKLSAgICBpbnQgbW9kaWZpZXIpCi0gIHsKLSAgICBfY29udmVydGVyQ2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBjb252ZXJ0ZXIgY2xhc3MuCi0gICAqIEJ5IGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgY29udmVydGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbnZlcnRlckNsYXNzTW9kaWZpZXJzKCkKLSAgewotICAgIGludCBtb2RpZmllcnMgPSBfY29udmVydGVyQ2xhc3NNb2RpZmllcnM7Ci0KLSAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotICAgIHsKLSAgICAgIG1vZGlmaWVycyB8PSBNb2RpZmllci5QVUJMSUM7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZGlmaWVyczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlQ29udmVydGVyQ2xhc3NNb2RpZmllcigKLSAgICBTdHJpbmcgbW9kaWZpZXIpCi0gIHsKLSAgICBhZGRDb252ZXJ0ZXJDbGFzc01vZGlmaWVyKF9wYXJzZU1vZGlmaWVyKG1vZGlmaWVyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzc0V4Y2x1ZGVkKGJvb2xlYW4gdGFnQ2xhc3NFeGNsdWRlZCkKLSAgewotICAgIF90YWdDbGFzc0V4Y2x1ZGVkID0gdGFnQ2xhc3NFeGNsdWRlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVGFnQ2xhc3NFeGNsdWRlZCgpCi0gIHsKLSAgICByZXR1cm4gX3RhZ0NsYXNzRXhjbHVkZWQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX3RhZ0NsYXNzRXhjbHVkZWQ7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29udmVydGVySWQ7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29udmVydGVyQ2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29udmVydGVyU3VwZXJDbGFzczsKLSAgcHJpdmF0ZSBpbnQgICAgIF9jb252ZXJ0ZXJDbGFzc01vZGlmaWVyczsKLQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIExvZ2dlciBfTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDb252ZXJ0ZXJCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRXZlbnRCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRXZlbnRCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDJkMDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0V2ZW50QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiBFdmVudEJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWctZXh0ZW5zaW9uCi0gKiBldmVudCBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEV2ZW50QmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIFV0aWwuZ2V0RXZlbnROYW1lRnJvbUV2ZW50VHlwZShfZXZlbnRUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50VHlwZSAgdGhlIGV2ZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50VHlwZSgKLSAgICBTdHJpbmcgZXZlbnRUeXBlKQotICB7Ci0gICAgX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBldmVudCB0eXBlIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9ldmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZXZlbnQgY2xhc3MgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudE5hbWUgIHRoZSBldmVudCBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRDbGFzcygKLSAgICBTdHJpbmcgZXZlbnRDbGFzcykKLSAgewotICAgIF9ldmVudENsYXNzID0gZXZlbnRDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBldmVudCBjbGFzcyBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50Q2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9ldmVudENsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGV2ZW50IGxpc3RlbmVyIGNsYXNzIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcGFyYW0gZXZlbnRMaXN0ZW5lckNsYXNzICB0aGUgZXZlbnQgbGlzdGVuZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50TGlzdGVuZXJDbGFzcygKLSAgICBTdHJpbmcgZXZlbnRMaXN0ZW5lckNsYXNzKQotICB7Ci0gICAgX2V2ZW50TGlzdGVuZXJDbGFzcyA9IGV2ZW50TGlzdGVuZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBldmVudCBsaXN0ZW5lciBjbGFzcyBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IGxpc3RlbmVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TGlzdGVuZXJDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2V2ZW50TGlzdGVuZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcGFyYW0gZXZlbnRTb3VyY2VJbnRlcmZhY2UgIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFdmVudFNvdXJjZUludGVyZmFjZSgKLSAgICBTdHJpbmcgZXZlbnRTb3VyY2VJbnRlcmZhY2UpCi0gIHsKLSAgICBfZXZlbnRTb3VyY2VJbnRlcmZhY2UgPSBldmVudFNvdXJjZUludGVyZmFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudFNvdXJjZUludGVyZmFjZSgpCi0gIHsKLSAgICByZXR1cm4gX2V2ZW50U291cmNlSW50ZXJmYWNlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyBfZXZlbnRUeXBlOwotICBwcml2YXRlIFN0cmluZyBfZXZlbnRDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgX2V2ZW50TGlzdGVuZXJDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgX2V2ZW50U291cmNlSW50ZXJmYWNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0V2ZW50UmVmQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0V2ZW50UmVmQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDcxN2U2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9FdmVudFJlZkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLS8qKgotICogRXZlbnRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudC1leHRlbnNpb24KLSAqIGV2ZW50IFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRSZWZCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gVXRpbC5nZXRFdmVudE5hbWVGcm9tRXZlbnRUeXBlKF9ldmVudFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGV2ZW50IHR5cGUgZm9yIHRoaXMgZXZlbnQgcmVmZXJlbmNlLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnRUeXBlICB0aGUgZXZlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRUeXBlKAotICAgIFN0cmluZyBldmVudFR5cGUpCi0gIHsKLSAgICBfZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX2V2ZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZWxpdmVyeSBwaGFzZXMgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEBwYXJhbSBkZWxpdmVyeVBoYXNlcyAgdGhlIGV2ZW50IGRlbGl2ZXJ5IHBoYXNlcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXZlbnREZWxpdmVyeVBoYXNlcygKLSAgICBTdHJpbmdbXSBkZWxpdmVyeVBoYXNlcykKLSAgewotICAgIGlmICgoX2RlbGl2ZXJ5UGhhc2VzICE9IG51bGwpICYmIChfZGVsaXZlcnlQaGFzZXMubGVuZ3RoID4gMCkpCi0gICAgewotICAgICAgaW50IG9sZExlbiA9IF9kZWxpdmVyeVBoYXNlcy5sZW5ndGg7Ci0gICAgICBpbnQgbmV3TGVuID0gZGVsaXZlcnlQaGFzZXMubGVuZ3RoOwotICAgICAgU3RyaW5nW10gbmV3RGVsaXZlcnlQaGFzZXMgPSBuZXcgU3RyaW5nW29sZExlbiArIG5ld0xlbl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KF9kZWxpdmVyeVBoYXNlcywgMCwgbmV3RGVsaXZlcnlQaGFzZXMsIDAsIG9sZExlbik7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGRlbGl2ZXJ5UGhhc2VzLCAwLCBuZXdEZWxpdmVyeVBoYXNlcywgb2xkTGVuLCBuZXdMZW4pOwotICAgICAgX2RlbGl2ZXJ5UGhhc2VzID0gbmV3RGVsaXZlcnlQaGFzZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfZGVsaXZlcnlQaGFzZXMgPSBkZWxpdmVyeVBoYXNlczsKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVsaXZlcnkgcGhhc2VzIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgZGVsaXZlcnkgcGhhc2VzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0RXZlbnREZWxpdmVyeVBoYXNlcygpCi0gIHsKLSAgICByZXR1cm4gX2RlbGl2ZXJ5UGhhc2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gYXV0b21hdGljYWxseSBpbXBsZW1lbnQKLSAgICogdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2Ugb24gdGhlIGdlbmVyYXRlZCBjb21wb25lbnQgc291cmNlLgotICAgKgotICAgKiBAcGFyYW0gaWdub3JlU291cmNlSW50ZXJmYWNlICB0cnVlLCAgdG8gaWdub3JlIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlOwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVTb3VyY2VJbnRlcmZhY2UoCi0gICAgYm9vbGVhbiBpZ25vcmVTb3VyY2VJbnRlcmZhY2UpCi0gIHsKLSAgICBfaWdub3JlU291cmNlSW50ZXJmYWNlID0gaWdub3JlU291cmNlSW50ZXJmYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gYXV0b21hdGljYWxseSBpbXBsZW1lbnQKLSAgICogdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2Ugb24gdGhlIGdlbmVyYXRlZCBjb21wb25lbnQgc291cmNlLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlLCAgdG8gaWdub3JlIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlOwotICAgKiAgICAgICAgICBmYWxzZSwgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZVNvdXJjZUludGVyZmFjZSgpCi0gIHsKLSAgICByZXR1cm4gX2lnbm9yZVNvdXJjZUludGVyZmFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlcyB0aGUgZXZlbnQgdHlwZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IHdpdGggdGhlIHJlZmVyZW5jaW5nIGV2ZW50IHR5cGUsCi0gICAqICAgICAgICAgIG9yIG51bGwgaWYgbm90IGZvdW5kCi0gICAqLwotICBwdWJsaWMgRXZlbnRCZWFuIHJlc29sdmVFdmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldE93bmVyKCkuZmluZEV2ZW50KF9ldmVudFR5cGUpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgICBfZXZlbnRUeXBlOwotICBwcml2YXRlIFN0cmluZ1tdIF9kZWxpdmVyeVBoYXNlczsKLSAgcHJpdmF0ZSBib29sZWFuICBfaWdub3JlU291cmNlSW50ZXJmYWNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2VzQ29uZmlnQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2VzQ29uZmlnQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmExMGZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNlc0NvbmZpZ0JlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIEZhY2VzQ29uZmlnQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEZhY2VzQ29uZmlnQmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgLyoqCi0gICAqIEFkZHMgYSBjb252ZXJ0ZXIgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb252ZXJ0ZXIgIHRoZSBjb252ZXJ0ZXIgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXIoCi0gICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpCi0gIHsKLSAgICBjb252ZXJ0ZXIuYXR0YWNoKHRoaXMpOwotICAgIGlmIChjb252ZXJ0ZXIuaGFzQ29udmVydGVySWQoKSkKLSAgICAgIF9jb252ZXJ0ZXJzLnB1dChjb252ZXJ0ZXIuZ2V0Q29udmVydGVySWQoKSwgY29udmVydGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZXIgZm9yIHRoaXMgY29udmVydGVyIHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBjb252ZXJ0ZXJJZCAgdGhlIGNvbnZlcnRlciB0eXBlIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBDb252ZXJ0ZXJCZWFuIGZpbmRDb252ZXJ0ZXIoCi0gICAgU3RyaW5nIGNvbnZlcnRlcklkKQotICB7Ci0gICAgcmV0dXJuIChDb252ZXJ0ZXJCZWFuKV9jb252ZXJ0ZXJzLmdldChjb252ZXJ0ZXJJZCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgY29udmVydGVycy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IGNvbnZlcnRlcnMsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDb252ZXJ0ZXJzKCkKLSAgewotICAgIHJldHVybiAhX2NvbnZlcnRlcnMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBjb252ZXJ0ZXJzIGluIHRoaXMgZmFjZXMKLSAgICogY29uZmlnLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29udmVydGVyIGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgY29udmVydGVycygpCi0gIHsKLSAgICByZXR1cm4gX2NvbnZlcnRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgdmFsaWRhdG9yIHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gdmFsaWRhdG9yICB0aGUgdmFsaWRhdG9yIHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVmFsaWRhdG9yKAotICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKQotICB7Ci0gICAgdmFsaWRhdG9yLmF0dGFjaCh0aGlzKTsKLSAgICBpZiAodmFsaWRhdG9yLmhhc1ZhbGlkYXRvcklkKCkpCi0gICAgICBfdmFsaWRhdG9ycy5wdXQodmFsaWRhdG9yLmdldFZhbGlkYXRvcklkKCksIHZhbGlkYXRvcik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsaWRhdG9yIGZvciB0aGlzIHZhbGlkYXRvciB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gdmFsaWRhdG9ySWQgIHRoZSB2YWxpZGF0b3IgdHlwZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdG9yQmVhbiBmaW5kVmFsaWRhdG9yKAotICAgIFN0cmluZyB2YWxpZGF0b3JJZCkKLSAgewotICAgIHJldHVybiAoVmFsaWRhdG9yQmVhbilfdmFsaWRhdG9ycy5nZXQodmFsaWRhdG9ySWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IHZhbGlkYXRvcnMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSB2YWxpZGF0b3JzLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzVmFsaWRhdG9ycygpCi0gIHsKLSAgICByZXR1cm4gIV92YWxpZGF0b3JzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgdmFsaWRhdG9ycyBpbiB0aGlzIGZhY2VzCi0gICAqIGNvbmZpZy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHZhbGlkYXRvciBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIHZhbGlkYXRvcnMoKQotICB7Ci0gICAgcmV0dXJuIF92YWxpZGF0b3JzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIGNvbXBvbmVudCB0byB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudCAgdGhlIGNvbXBvbmVudCB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudCgKLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIC8vIEdlbmVyaWMgImluY2x1ZGVzIiB3aWxsIG5vdCBoYXZlIGEgY29tcG9uZW50IHR5cGUKLSAgICBpZiAoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvbmVudC5hdHRhY2godGhpcyk7Ci0gICAgICBfY29tcG9uZW50cy5wdXQoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSwgY29tcG9uZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGZvciB0aGlzIGNvbXBvbmVudCB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAgdGhlIGNvbXBvbmVudCB0eXBlIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuIGZpbmRDb21wb25lbnQoCi0gICAgU3RyaW5nIGNvbXBvbmVudFR5cGUpCi0gIHsKLSAgICByZXR1cm4gKENvbXBvbmVudEJlYW4pX2NvbXBvbmVudHMuZ2V0KGNvbXBvbmVudFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IGNvbXBvbmVudHMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb21wb25lbnRzLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9uZW50cygpCi0gIHsKLSAgICByZXR1cm4gIV9jb21wb25lbnRzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgY29tcG9uZW50cyBpbiB0aGlzIGZhY2VzCi0gICAqIGNvbmZpZy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGNvbXBvbmVudHMoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhbiBldmVudCB0byB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50ICB0aGUgZXZlbnQgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFdmVudCgKLSAgICBFdmVudEJlYW4gZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfd2FybmluZygiTWlzc2luZyBldmVudCB0eXBlIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LmdldEV2ZW50TGlzdGVuZXJDbGFzcygpID09IG51bGwpCi0gICAgewotICAgICAgX3dhcm5pbmcoIkV2ZW50IFwiIiArIGV2ZW50LmdldEV2ZW50VHlwZSgpICsgIlwiICIgKwotICAgICAgICAgICAgICAgICAgICJoYXMgbm8gbGlzdGVuZXIgY2xhc3MiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQuZ2V0RXZlbnRDbGFzcygpID09IG51bGwpCi0gICAgewotICAgICAgX3dhcm5pbmcoIkV2ZW50IFwiIiArIGV2ZW50LmdldEV2ZW50VHlwZSgpICsgIlwiICIgKwotICAgICAgICAgICAgICAgICAgICJoYXMgbm8gZXZlbnQgY2xhc3MiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGV2ZW50LmF0dGFjaCh0aGlzKTsKLSAgICAgIF9ldmVudHMucHV0KGV2ZW50LmdldEV2ZW50VHlwZSgpLCBldmVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93YXJuaW5nKFN0cmluZyBzKQotICB7Ci0gICAgX0xPRy53YXJuaW5nKHMrIlxuICBwYXJzaW5nIHJlc291cmNlOiIrZ2V0Q3VycmVudFJlc291cmNlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IGZvciB0aGlzIGV2ZW50IHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudFR5cGUgIHRoZSBldmVudCB0eXBlIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBFdmVudEJlYW4gZmluZEV2ZW50KAotICAgIFN0cmluZyBldmVudFR5cGUpCi0gIHsKLSAgICByZXR1cm4gKEV2ZW50QmVhbilfZXZlbnRzLmdldChldmVudFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IGV2ZW50cy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IGV2ZW50cywKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0V2ZW50cygpCi0gIHsKLSAgICByZXR1cm4gIV9ldmVudHMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBldmVudHMgaW4gdGhpcyBmYWNlcwotICAgKiBjb25maWcuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGV2ZW50cygpCi0gIHsKLSAgICByZXR1cm4gX2V2ZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSByZW5kZXIga2l0IHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyS2l0ICB0aGUgcmVuZGVyIGtpdCB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdCgKLSAgICBSZW5kZXJLaXRCZWFuIHJlbmRlcktpdCkKLSAgewotICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IHJlbmRlcktpdC5nZXRSZW5kZXJLaXRJZCgpOwotICAgIFJlbmRlcktpdEJlYW4gZXhpc3RpbmcgPSBmaW5kUmVuZGVyS2l0KHJlbmRlcktpdElkKTsKLQotICAgIGlmIChleGlzdGluZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlbmRlcktpdC5hdHRhY2godGhpcyk7Ci0gICAgICBfcmVuZGVyS2l0cy5wdXQocmVuZGVyS2l0SWQsIHJlbmRlcktpdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBleGlzdGluZy5hZGRBbGxSZW5kZXJlcnMocmVuZGVyS2l0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVuZGVyIGtpdCBmb3IgdGhpcyByZW5kZXIga2l0IGlkLgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyS2l0SWQgIHRoZSByZW5kZXIga2l0IGlkIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBSZW5kZXJLaXRCZWFuIGZpbmRSZW5kZXJLaXQoCi0gICAgU3RyaW5nIHJlbmRlcktpdElkKQotICB7Ci0gICAgcmV0dXJuIChSZW5kZXJLaXRCZWFuKV9yZW5kZXJLaXRzLmdldChyZW5kZXJLaXRJZCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgcmVuZGVyIGtpdHMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSByZW5kZXIga2l0cywKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1JlbmRlcktpdHMoKQotICB7Ci0gICAgcmV0dXJuICFfcmVuZGVyS2l0cy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIHJlbmRlciBraXRzIGluIHRoaXMgZmFjZXMKLSAgICogY29uZmlnLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyIGtpdCBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIHJlbmRlcktpdHMoKQotICB7Ci0gICAgcmV0dXJuIF9yZW5kZXJLaXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgVVJMIGdldEN1cnJlbnRSZXNvdXJjZSgpCi0gIHsKLSAgICByZXR1cm4gX2N1cnJlbnRSZXNvdXJjZTsKLSAgfQotICAKLSAgcHVibGljIFVSTCBzZXRDdXJyZW50UmVzb3VyY2UoVVJMIHJlc291cmNlKQotICB7Ci0gICAgVVJMIF9jdXIgPSBfY3VycmVudFJlc291cmNlOwotICAgIF9jdXJyZW50UmVzb3VyY2UgPSByZXNvdXJjZTsKLSAgICByZXR1cm4gX2N1cjsKLSAgfQotCi0gIHByaXZhdGUgTWFwIF9jb252ZXJ0ZXJzID0gbmV3IFRyZWVNYXAoKTsKLSAgcHJpdmF0ZSBNYXAgX3ZhbGlkYXRvcnMgPSBuZXcgVHJlZU1hcCgpOwotICBwcml2YXRlIE1hcCBfY29tcG9uZW50cyA9IG5ldyBUcmVlTWFwKCk7Ci0gIHByaXZhdGUgTWFwIF9ldmVudHMgPSBuZXcgVHJlZU1hcCgpOwotICBwcml2YXRlIE1hcCBfcmVuZGVyS2l0cyA9IG5ldyBUcmVlTWFwKCk7Ci0gIHByaXZhdGUgVVJMIF9jdXJyZW50UmVzb3VyY2UgPSBudWxsOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIExvZ2dlciBfTE9HID0gTG9nZ2VyLmdldExvZ2dlcihGYWNlc0NvbmZpZ0JlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNlc0NvbmZpZ1BhcnNlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2VzQ29uZmlnUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjExMTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2VzQ29uZmlnUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkFic3RyYWN0T2JqZWN0Q3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UucnVsZXMuQmVhblByb3BlcnR5U2V0dGVyUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuWEluY2x1ZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmFjZXNDb25maWdQYXJzZXIKLXsKLSAgcHVibGljIHZvaWQgbWVyZ2UoCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyLAotICAgIFVSTCAgICAgICAgICAgICB1cmwpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gY29ubi5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotCi0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gRXN0YWJsaXNoIHRoZSBjdXJyZW50IGxhc3QtbW9kaWZpZWQgdmFsdWUKLSAgICAgICAgLy8gQXMgbmV3IGNvbXBvbmVudHMgYXJlIGFkZGVkLCB0aGV5IHdpbGwgcmVtZW1iZXIKLSAgICAgICAgLy8gdGhpcyBjdXJyZW50IHZhbHVlIGFzIHRoZWlyIG93biBsYXN0LW1vZGlmaWVkCi0gICAgICAgIG93bmVyLnRvdWNoKGxhc3RNb2RpZmllZCk7Ci0KLSAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVEaWdlc3RlcigpOwotICAgICAgICBkaWdlc3Rlci5wdXNoKHVybCk7Ci0gICAgICAgIGRpZ2VzdGVyLnB1c2gob3duZXIpOwotICAgICAgICBkaWdlc3Rlci5wYXJzZShpcyk7Ci0gICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgIiArIHVybCwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlICIgKyB1cmwsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgIiArIHVybCwgZSk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZUVtcHR5RGlnZXN0ZXIoKQotICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLSAgewotICAgIFNBWFBhcnNlckZhY3Rvcnkgc3BmID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIHNwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAvLyByZXF1aXJlcyBKQVhQIDEuMywgaW4gSmF2YVNFIDUuMAotICAgIC8vIHNwZi5zZXRYSW5jbHVkZUF3YXJlKHRydWUpOwotICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKHNwZi5uZXdTQVhQYXJzZXIoKSk7Ci0gICAgZGlnZXN0ZXIuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgCi0gICAgcmV0dXJuIGRpZ2VzdGVyOwotICB9Ci0KLSAgc3RhdGljIHByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudERpZ2VzdGVyUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIsIGJvb2xlYW4gd2l0aENyZWF0ZSkKLSAgewotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudAotICAgIC8vIE9ubHkgdXNlIGlmIHdlJ3JlIGNyZWF0aW5nIHRoZSBjb21wb25lbnQ7ICB0dXJuIHRoaXMgb2ZmCi0gICAgLy8gd2hlbiB3ZSdyZSBzaW1wbHkgaW5jbHVkaW5nIGNvbnRlbnQKLSAgICBpZiAod2l0aENyZWF0ZSkKLSAgICB7Ci0gICAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50Ci0gICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQiLCBDb21wb25lbnRCZWFuLmNsYXNzKTsKLSAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudFR5cGUiKTsKLSAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRDbGFzcyIpOwotICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2Rlc2NyaXB0aW9uIik7Ci0gICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29tcG9uZW50IiwgImFkZENvbXBvbmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5Ci0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5IiwgUHJvcGVydHlCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eU5hbWUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9kZWZhdWx0LXZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkiLCAiYWRkUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgCi0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0Ci0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0IiwgRmFjZXRCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQvZmFjZXQtbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWNldE5hbWUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0IiwgImFkZEZhY2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gTWF2ZW4gRmFjZXMgUGx1Z2luCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbgotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2xvbmctZGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LWZhbWlseSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRGYW1pbHkiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtc3VwZXJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudFN1cGVydHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1zdXBlcmNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudFN1cGVyY2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9yZW5kZXJlci10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVyVHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL25hbWluZy1jb250YWluZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtaW5nQ29udGFpbmVyIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vYWNjZXB0cy1jaGlsZC1jb21wb25lbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0NsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLXN1cGVyY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnU3VwZXJjbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1oYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0hhbmRsZXIiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9pbXBsZW1lbnRhdGlvbi10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uVHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1jbGFzcy1leGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRDbGFzc0V4Y2x1ZGVkIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLWNsYXNzLWV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0NsYXNzRXhjbHVkZWQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtaW1wbGVtZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRJbXBsZW1lbnRzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LXNlcmlhbC11aWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50U2VyaWFsVUlEIik7Ci0gICAgCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1jbGFzcy1tb2RpZmllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VUYWdDbGFzc01vZGlmaWVyIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwgMCk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLWFnZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VVbnN1cHBvcnRlZEFnZW50cyIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLWFnZW50cyIsIDApOwotCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1jbGFzcy1tb2RpZmllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VDb21wb25lbnRDbGFzc01vZGlmaWVyIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LWNsYXNzLW1vZGlmaWVyIiwgMCk7Ci0gICAgZGlnZXN0ZXIuYWRkUnVsZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlKCJ0YWdOYW1lIikpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3VpeDItbG9jYWwtbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbE5hbWUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi91aXgyLW5vZGUtY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9kZUNsYXNzIik7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXZlbnQKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudCIsIEV2ZW50UmVmQmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXZlbnQvZXZlbnQtdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudFR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudC9ldmVudC1kZWxpdmVyeS1waGFzZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudERlbGl2ZXJ5UGhhc2VzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXZlbnQvaWdub3JlLXNvdXJjZS1pbnRlcmZhY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlU291cmNlSW50ZXJmYWNlIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V2ZW50IiwgImFkZEV2ZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3N0YXRlLWhvbGRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZUhvbGRlciIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vanNwLXByb3BlcnR5LW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwUHJvcGVydHlOYW1lIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9saXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3JlcXVpcmVkIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9hbGlhcy1vZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGlhc09mIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi92aXJ0dWFsIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi90cmFuc2llbnQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2xpdGVyYWwtb25seSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXRlcmFsT25seSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vZW51bSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9hbHRlcm5hdGUtY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0ZXJuYXRlQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3RhZy1hdHRyaWJ1dGUtZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQXR0cmlidXRlRXhjbHVkZWQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2lzLXNldC1tZXRob2QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNTZXRNZXRob2QiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2lzLXNldC1tZXRob2Qtc2NvcGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNTZXRNZXRob2RTY29wZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vaXMtZ2V0LWxvY2FsLW1ldGhvZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc0dldExvY2FsTWV0aG9kIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9pcy1nZXQtbG9jYWwtbWV0aG9kLXNjb3BlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc0dldExvY2FsTWV0aG9kU2NvcGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3J0ZXhwcnZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydGV4cHJ2YWx1ZSIpOwotICAgIAotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LXZhbHVlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VQcm9wZXJ0eVZhbHVlcyIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktdmFsdWVzIiwgMCk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdW5zdXBwb3J0ZWQtYWdlbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVVuc3VwcG9ydGVkQWdlbnRzIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1hZ2VudHMiLCAwKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1yZW5kZXIta2l0cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VVbnN1cHBvcnRlZFJlbmRlcktpdHMiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLXJlbmRlci1raXRzIiwgMCk7Ci0KLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL21ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlL3JldHVybi10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVyblR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9tZXRob2QtYmluZGluZy1zaWduYXR1cmUvcGFyYW1ldGVyLXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFBhcmFtZXRlclR5cGUiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL21ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZS9wYXJhbWV0ZXItdHlwZSIsIDApOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL21ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAic2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RTaWduYXR1cmVCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS91c2UtbWF4LXRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlTWF4VGltZSIpOyAgICAgICAgCi0KLQotICAgIC8vIFhJbmNsdWRlIHJ1bGVzCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSShYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOwotICAgIGRpZ2VzdGVyLmFkZEZhY3RvcnlDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvaW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRJbmNsdWRlRmFjdG9yeS5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGlnZXN0ZXIgY3JlYXRlRGlnZXN0ZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBEaWdlc3RlciBkaWdlc3RlciA9IGNyZWF0ZUVtcHR5RGlnZXN0ZXIoKTsKLQotICAgIGFkZENvbXBvbmVudERpZ2VzdGVyUnVsZXMoZGlnZXN0ZXIsIHRydWUpOwotICAgIAotICAgIC8vIEphdmEgRW50ZXJwcmlzZSA1LjAKLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsKLSAgICAvL2RpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnIiwgRmFjZXNDb25maWdCZWFuLmNsYXNzKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIiLCBDb252ZXJ0ZXJCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnRlcklkIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb252ZXJ0ZXJDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIiLCAiYWRkQ29udmVydGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRlckJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkiLCBQcm9wZXJ0eUJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9wcm9wZXJ0eS1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5TmFtZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9wcm9wZXJ0eS1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eUNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L2RlZmF1bHQtdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdFZhbHVlIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eSIsICJhZGRQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IiLCBWYWxpZGF0b3JCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRvcklkIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0b3JDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IiLCAiYWRkVmFsaWRhdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkiLCBQcm9wZXJ0eUJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9wcm9wZXJ0eS1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5TmFtZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9wcm9wZXJ0eS1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eUNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L2RlZmF1bHQtdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdFZhbHVlIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eSIsICJhZGRQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotCi0gICAgLy8gZmFjZXMtY29uZmlnL3JlbmRlci1raXQKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0IiwgUmVuZGVyS2l0QmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXIta2l0LWlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcktpdElkIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL3JlbmRlci1raXQiLCAiYWRkUmVuZGVyS2l0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlcktpdEJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlciIsIFJlbmRlcmVyQmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlci9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvY29tcG9uZW50LWZhbWlseSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRGYW1pbHkiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL3JlbmRlcmVyLXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXJUeXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlci9yZW5kZXJlci1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXJlckNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIiLCAiYWRkUmVuZGVyZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyZXJCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLQotICAgIC8vIFRCRDogSlNSLTI3NiBtZXRhZGF0YSAoYXNrIEplZmYgU3RlcGhlbnNvbikKLQotCi0gICAgLy8gTWF2ZW4gRmFjZXMgUGx1Z2luCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50Ci0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudCIsIEV2ZW50QmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudC9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZXZlbnQtdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudFR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50L2V2ZW50LWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50Q2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50L2V2ZW50LWxpc3RlbmVyLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50TGlzdGVuZXJDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZXZlbnQtc291cmNlLWludGVyZmFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudFNvdXJjZUludGVyZmFjZSIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50IiwgImFkZEV2ZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vbG9uZy1kZXNjcmlwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nRGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi90YWctY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi90YWctY2xhc3MtZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3NFeGNsdWRlZCIpOwotICAgIGRpZ2VzdGVyLmFkZFJ1bGUoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi90YWctbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICBuZXcgQmVhblByb3BlcnR5U2V0dGVyUnVsZSgidGFnTmFtZSIpKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVRhZ0NsYXNzTW9kaWZpZXIiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLCAwKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi90YWctYXR0cmlidXRlLWV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0F0dHJpYnV0ZUV4Y2x1ZGVkIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9saXRlcmFsLW9ubHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGl0ZXJhbE9ubHkiKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbgotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL2xvbmctZGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vdGFnLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0NsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vdGFnLWNsYXNzLWV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0NsYXNzRXhjbHVkZWQiKTsgICAgCi0gICAgZGlnZXN0ZXIuYWRkUnVsZSgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL3RhZy1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlKCJ0YWdOYW1lIikpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlVGFnQ2xhc3NNb2RpZmllciIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL3RhZy1jbGFzcy1tb2RpZmllciIsIDApOwotICAgIAotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi90YWctYXR0cmlidXRlLWV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0F0dHJpYnV0ZUV4Y2x1ZGVkIik7Ci0gICAgLy8gZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS91c2UtbWF4LXRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZU1heFRpbWUiKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL3JlbmRlcmVyLWV4dGVuc2lvbgotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItZXh0ZW5zaW9uL2NvbXBvbmVudC10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudFR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL3JlbmRlcmVyLWV4dGVuc2lvbi9yZW5kZXJlci1zdXBlcmNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVyU3VwZXJjbGFzcyIpOwotCi0gICAgcmV0dXJuIGRpZ2VzdGVyOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBjbGFzcyBDb21wb25lbnRJbmNsdWRlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T2JqZWN0Q3JlYXRpb25GYWN0b3J5Ci0gIHsKLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZU9iamVjdCgKLSAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIFN0cmluZyBocmVmID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaHJlZiIpOwotICAgICAgaWYgKGhyZWYgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWlzc2luZyBocmVmIGF0dHJpYnV0ZSIpOwotCi0gICAgICBVUkwgbWFzdGVyID0gKFVSTClkaWdlc3Rlci5nZXRSb290KCk7Ci0gICAgICBVUkwgaW5jbHVkZWQgPSBuZXcgVVJMKG1hc3RlciwgaHJlZik7Ci0KLSAgICAgIERpZ2VzdGVyIGluY2x1ZGVkRGlnZXN0ZXIgPSBjcmVhdGVFbXB0eURpZ2VzdGVyKCk7Ci0gICAgICBhZGRDb21wb25lbnREaWdlc3RlclJ1bGVzKGluY2x1ZGVkRGlnZXN0ZXIsIGZhbHNlKTsKLSAgICAgIGluY2x1ZGVkRGlnZXN0ZXIucHVzaChpbmNsdWRlZCk7Ci0gICAgICBpbmNsdWRlZERpZ2VzdGVyLnB1c2goZGlnZXN0ZXIucGVlaygpKTsKLQotICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gaW5jbHVkZWQub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgaW5jbHVkZWREaWdlc3Rlci5wYXJzZShpcyk7Ci0gICAgICBpcy5jbG9zZSgpOwotCi0gICAgICAvLyBXZSBkb24ndCByZWFsbHkgd2FudCB0aGUgaW5jbHVkZWQgb2JqZWN0IC0gYnV0IHJldHVybiBpdCBhbnl3YXkKLSAgICAgIHJldHVybiBpbmNsdWRlZDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNldEJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNldEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1YjRlNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLS8qKgotICogRmFjZXRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudCBvcgotICogcmVuZGVyZXIgZmFjZXQgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWNldEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIC8qKgotICAgKiBTZXRzIHRoZSBmYWNldCBuYW1lIGZvciB0aGlzIGZhY2V0LgotICAgKgotICAgKiBAcGFyYW0gZmFjZXROYW1lICB0aGUgZmFjZXQgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFjZXROYW1lKAotICAgIFN0cmluZyBmYWNldE5hbWUpCi0gIHsKLSAgICBfZmFjZXROYW1lID0gZmFjZXROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZhY2V0IG5hbWUgZm9yIHRoaXMgZmFjZXQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBmYWNldCBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhY2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX2ZhY2V0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVxdWlyZWQgZmxhZyBvZiB0aGlzIGZhY2V0LgotICAgKgotICAgKiBAcGFyYW0gcmVxdWlyZWQgIHRoZSBmYWNldCByZXF1aXJlZCBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZCgKLSAgICBib29sZWFuIHJlcXVpcmVkKQotICB7Ci0gICAgX3JlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyByZXF1aXJlZCBmbGFnIG9mIHRoaXMgZmFjZXQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBmYWNldCByZXF1aXJlZCBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkKLSAgewotICAgIHJldHVybiBfcmVxdWlyZWQ7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyAgX2Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyAgX2ZhY2V0TmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIF9yZXF1aXJlZDsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9NZXRob2RTaWduYXR1cmVCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvTWV0aG9kU2lnbmF0dXJlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTEyMWQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9NZXRob2RTaWduYXR1cmVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNZXRob2RTaWduYXR1cmVCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudAotICogcHJvcGVydHktZXh0ZW5zaW9uIG1ldGhvZC1zaWduYXR1cmUgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTaWduYXR1cmVCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBNZXRob2RTaWduYXR1cmVCZWFuLgotICAgKi8KLSAgcHVibGljIE1ldGhvZFNpZ25hdHVyZUJlYW4oKQotICB7Ci0gICAgX3BhcmFtZXRlclR5cGVzID0gbmV3IExpbmtlZExpc3QoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgbmV3IHBhcmFtZXRlciB0eXBlIHRvIHRoaXMgbWV0aG9kIHNpZ25hdHVyZS4KLSAgICoKLSAgICogQHBhcmFtIHBhcmFtZXRlclR5cGUgIHRoZSBwYXJhbWV0ZXIgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyVHlwZSgKLSAgICBTdHJpbmcgcGFyYW1ldGVyVHlwZSkKLSAgewotICAgIF9wYXJhbWV0ZXJUeXBlcy5hZGQocGFyYW1ldGVyVHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMgYXMgYW4gYXJyYXkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwYXJhbWV0ZXIgdHlwZSBsaXN0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlfcGFyYW1ldGVyVHlwZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBzaWduYXR1cmUuCi0gICAqCi0gICAqIEBwYXJhbSByZXR1cm5UeXBlICB0aGUgbWV0aG9kIHNpZ25hdHVyZSByZXR1cm4gdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZSgKLSAgICBTdHJpbmcgcmV0dXJuVHlwZSkKLSAgewotICAgIF9yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBzaWduYXR1cmUuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHJldHVybiB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9yZXR1cm5UeXBlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX3JldHVyblR5cGU7Ci0gIHByaXZhdGUgTGlzdCAgIF9wYXJhbWV0ZXJUeXBlczsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9PYmplY3RCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvT2JqZWN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQzM2FiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9PYmplY3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLS8qKgotICogT2JqZWN0QmVhbiBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIHBhcnNlZCBiZWFucy4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdEJlYW4KLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgT2JqZWN0QmVhbi4KLSAgICovCi0gIHB1YmxpYyBPYmplY3RCZWFuKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudCBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZQotICAgKiB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC4KLSAgICoKLSAgICogQHBhcmFtIHRpbWVzdGFtcCAgdGhlIHRpbWVzdGFtcCBpbiBVVEMgbWlsbGlzCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQgaGFzIGJlZW4gbW9kaWZpZWQsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkU2luY2UoCi0gICAgbG9uZyB0aW1lc3RhbXApCi0gIHsKLSAgICByZXR1cm4gKF9sYXN0TW9kaWZpZWQgPiB0aW1lc3RhbXApOwotICB9Ci0KLSAgcHJvdGVjdGVkIEZhY2VzQ29uZmlnQmVhbiBnZXRPd25lcigpCi0gIHsKLSAgICByZXR1cm4gX293bmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGFjaGVzIHRoZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvd25lciAgdGhlIGZhY2VzIGNvbmZpZyBvd25lcgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoKAotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lcikKLSAgewotICAgIF9vd25lciA9IG93bmVyOwotICAgIE9iamVjdEJlYW4gb2JqZWN0ID0gb3duZXI7Ci0gICAgdG91Y2gob2JqZWN0Ll9sYXN0TW9kaWZpZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wIGZvciB0aGUgcGFyc2VkIGZhY2VzIGNvbmZpZyBkb2N1bWVudAotICAgKiBpZiBpdCBpcyBuZXdlciB0aGFuIHRoZSBleGlzdGluZyBsYXN0IG1vZGlmaWVkIHRpbWVzdGFtcC4KLSAgICoKLSAgICogQHBhcmFtIGxhc3RNb2RpZmllZCAgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBpbiBVVEMgbWlsbGlzCi0gICAqLwotICB2b2lkIHRvdWNoKAotICAgIGxvbmcgbGFzdE1vZGlmaWVkKQotICB7Ci0gICAgX2xhc3RNb2RpZmllZCA9IE1hdGgubWF4KF9sYXN0TW9kaWZpZWQsIGxhc3RNb2RpZmllZCk7Ci0gIH0KLQotICBwcml2YXRlIGxvbmcgX2xhc3RNb2RpZmllZDsKLSAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gX293bmVyOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1Byb3BlcnR5QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1Byb3BlcnR5QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTMwMmZjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Qcm9wZXJ0eUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLS8qKgotICogUHJvcGVydHlCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudCBwcm9wZXJ0eQotICogWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUJlYW4gZXh0ZW5kcyBBdHRyaWJ1dGVCZWFuCi17Ci0gICAgcHVibGljIHZvaWQgc2V0VXNlTWF4VGltZShib29sZWFuIF91c2VNYXhUaW1lKSAKLSAgICB7Ci0gICAgICB0aGlzLl91c2VNYXhUaW1lID0gX3VzZU1heFRpbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZU1heFRpbWUoKSAKLSAgICB7Ci0gICAgICByZXR1cm4gX3VzZU1heFRpbWU7Ci0gICAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHNldEF0dHJpYnV0ZU5hbWUocHJvcGVydHlOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlTmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHByb3BlcnR5IGNsYXNzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHlDbGFzcyAgdGhlIHByb3BlcnR5IGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUNsYXNzKAotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzKQotICB7Ci0gICAgc2V0QXR0cmlidXRlQ2xhc3MocHJvcGVydHlDbGFzcyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgY2xhc3MgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUNsYXNzKCkKLSAgewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVDbGFzcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHBhcmFtZXRlcml6ZWQgdHlwZXMgZm9yIHRoaXMgcHJvcGVydHkKLSAgICogaWYgaXQgdXNlcyBnZW5lcmljcy4KLSAgICoKLSAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgcGFyYW1ldGVyaXplZCB0eXBlcyBmb3IgdGhpcyBwcm9wZXJ0eQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCkKLSAgewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyAgdGhlIHByb3BlcnR5IHZhbHVlcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZXMoCi0gICAgU3RyaW5nW10gcHJvcGVydHlWYWx1ZXMpCi0gIHsKLSAgICBfcHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IHZhbHVlcwotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFByb3BlcnR5VmFsdWVzKCkKLSAgewotICAgIHJldHVybiBfcHJvcGVydHlWYWx1ZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc3RhdGVIb2xkZXIgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gc3RhdGVIb2xkZXIgIHRoZSBwcm9wZXJ0eSBzdGF0ZUhvbGRlciBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGF0ZUhvbGRlcigKLSAgICBib29sZWFuIHN0YXRlSG9sZGVyKQotICB7Ci0gICAgX3N0YXRlSG9sZGVyID0gc3RhdGVIb2xkZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBzdGF0ZUhvbGRlciBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBzdGF0ZUhvbGRlciBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlSG9sZGVyKCkKLSAgewotICAgIHJldHVybiBfc3RhdGVIb2xkZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdHJhbnNpZW50IGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHRyYW5zaWVudCAgdGhlIHByb3BlcnR5IHRyYW5zaWVudCBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUcmFuc2llbnQoCi0gICAgYm9vbGVhbiB0cmFuc2llbnRfKQotICB7Ci0gICAgX3RyYW5zaWVudCA9IHRyYW5zaWVudF87Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cmFuc2llbnQgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgdHJhbnNpZW50IGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkKLSAgewotICAgIHJldHVybiBfdHJhbnNpZW50OwotICB9Ci0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbGlzdCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBsaXN0ICB0aGUgcHJvcGVydHkgbGlzdCBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMaXN0KAotICAgIGJvb2xlYW4gbGlzdF8pCi0gIHsKLSAgICBfbGlzdCA9IGxpc3RfOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgbGlzdCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBsaXN0IGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gX2xpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVxdWlyZWQgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gcmVxdWlyZWQgIHRoZSBwcm9wZXJ0eSByZXF1aXJlZCBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZCgKLSAgICBib29sZWFuIHJlcXVpcmVkKQotICB7Ci0gICAgX3JlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyByZXF1aXJlZCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSByZXF1aXJlZCBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkKLSAgewotICAgIHJldHVybiBfcmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbGl0ZXJhbE9ubHkgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gbGl0ZXJhbE9ubHkgIHRoZSBwcm9wZXJ0eSBsaXRlcmFsT25seSBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMaXRlcmFsT25seSgKLSAgICBib29sZWFuIGxpdGVyYWxPbmx5KQotICB7Ci0gICAgX2xpdGVyYWxPbmx5ID0gbGl0ZXJhbE9ubHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBsaXRlcmFsT25seSBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBsaXRlcmFsT25seSBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpdGVyYWxPbmx5KCkKLSAgewotICAgIHJldHVybiBfbGl0ZXJhbE9ubHk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYWxpYXMgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGFsaWFzT2YgIHRoZSBwcm9wZXJ0eSBhbGlhcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWxpYXNPZigKLSAgICBTdHJpbmcgYWxpYXNPZikKLSAgewotICAgIF9hbGlhc09mID0gYWxpYXNPZjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhbGlhcyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgYWxpYXMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXNPZigpCi0gIHsKLSAgICByZXR1cm4gX2FsaWFzT2Y7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRBZ2VudHMgIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuc3VwcG9ydGVkQWdlbnRzKAotICAgIFN0cmluZ1tdIHVuc3VwcG9ydGVkQWdlbnRzKQotICB7Ci0gICAgaWYgKHVuc3VwcG9ydGVkQWdlbnRzID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInVuc3VwcG9ydGVkQWdlbnRzIik7Ci0KLSAgICBfdW5zdXBwb3J0ZWRBZ2VudHMgPSB1bnN1cHBvcnRlZEFnZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHVuc3VwcG9ydGVkIGFnZW50cwotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFVuc3VwcG9ydGVkQWdlbnRzKCkKLSAgewotICAgIHJldHVybiBfdW5zdXBwb3J0ZWRBZ2VudHM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdW5zdXBwb3J0ZWQgUmVuZGVyS2l0cyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkUmVuZGVyS2l0cyAgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuc3VwcG9ydGVkUmVuZGVyS2l0cygKLSAgICBTdHJpbmdbXSB1bnN1cHBvcnRlZFJlbmRlcktpdHMpCi0gIHsKLSAgICBpZiAodW5zdXBwb3J0ZWRSZW5kZXJLaXRzID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInVuc3VwcG9ydGVkUmVuZGVyS2l0cyIpOwotCi0gICAgX3Vuc3VwcG9ydGVkUmVuZGVyS2l0cyA9IHVuc3VwcG9ydGVkUmVuZGVyS2l0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB1bnN1cHBvcnRlZCBSZW5kZXJLaXRzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0VW5zdXBwb3J0ZWRSZW5kZXJLaXRzKCkKLSAgewotICAgIHJldHVybiBfdW5zdXBwb3J0ZWRSZW5kZXJLaXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHRhZyBhdHRyaWJ1dGUgZXhjbHVkZWQgZmxhZyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGV4Y2x1ZGVkICB0cnVlLCAgaWYgdGhlIHRhZyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGV4Y2x1ZGVkOwotICAgKiAgICAgICAgICAgICAgICAgIGZhbHNlLCBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKAotICAgIGJvb2xlYW4gZXhjbHVkZWQpCi0gIHsKLSAgICBfdGFnQXR0cmlidXRlRXhjbHVkZWQgPSBleGNsdWRlZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0YWcgYXR0cmlidXRlIGV4Y2x1ZGVkIGZsYWcgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSwgIGlmIHRoZSB0YWcgYXR0cmlidXRlIHNob3VsZCBiZSBleGNsdWRlZDsKLSAgICogICAgICAgICBmYWxzZSwgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkKLSAgewotICAgIHJldHVybiBfdGFnQXR0cmlidXRlRXhjbHVkZWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBlbnVtZXJhdGVkIEphdmEgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW51bSgpCi0gIHsKLSAgICByZXR1cm4gX2VudW07Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBlbnVtZXJhdGVkIEphdmEgdHlwZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudW0oYm9vbGVhbiBpc0VudW0pCi0gIHsKLSAgICBfZW51bSA9IGlzRW51bTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSBpcyBhIG1ldGhvZCBiaW5kaW5nLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZywKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kQmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nIi5lcXVhbHMoZ2V0UHJvcGVydHlDbGFzcygpKSk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSBpcyBhIG1ldGhvZCBiaW5kaW5nLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZywKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kRXhwcmVzc2lvbigpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIi5lcXVhbHMoZ2V0UHJvcGVydHlDbGFzcygpKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgaW50byBhIFN0cmluZyBhcnJheQotICAgKiB1c2luZyBzcGFjZSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMgIHRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlUHJvcGVydHlWYWx1ZXMoCi0gICAgU3RyaW5nIHByb3BlcnR5VmFsdWVzKQotICB7Ci0gICAgc2V0UHJvcGVydHlWYWx1ZXMocHJvcGVydHlWYWx1ZXMuc3BsaXQoIiAiKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgcHJvcGVydHkgaW50byBhIFN0cmluZyBhcnJheQotICAgKiB1c2luZyBzcGFjZSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRBZ2VudHMgIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlVW5zdXBwb3J0ZWRBZ2VudHMoCi0gICAgU3RyaW5nIHVuc3VwcG9ydGVkQWdlbnRzKQotICB7Ci0gICAgc2V0VW5zdXBwb3J0ZWRBZ2VudHModW5zdXBwb3J0ZWRBZ2VudHMuc3BsaXQoIiAiKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSB1bnN1cHBvcnRlZCBSZW5kZXJLaXRzIGZvciB0aGlzIHByb3BlcnR5IGludG8gYSBTdHJpbmcgYXJyYXkKLSAgICogdXNpbmcgc3BhY2UgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcy4KLSAgICoKLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkUmVuZGVyS2l0cyAgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlVW5zdXBwb3J0ZWRSZW5kZXJLaXRzKAotICAgIFN0cmluZyB1bnN1cHBvcnRlZFJlbmRlcktpdHMpCi0gIHsKLSAgICBzZXRVbnN1cHBvcnRlZFJlbmRlcktpdHModW5zdXBwb3J0ZWRSZW5kZXJLaXRzLnNwbGl0KCIgIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIEpTUCBuYW1lIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBqc3BQcm9wZXJ0eU5hbWUgIHRoZSBKU1AgcHJvcGVydHkgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SnNwUHJvcGVydHlOYW1lKAotICAgIFN0cmluZyBqc3BQcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBfanNwUHJvcGVydHlOYW1lID0ganNwUHJvcGVydHlOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpTUCBuYW1lIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKU1AgcHJvcGVydHkgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKc3BQcm9wZXJ0eU5hbWUoKQotICB7Ci0gICAgaWYgKF9qc3BQcm9wZXJ0eU5hbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU5hbWUoKTsKLQotICAgIHJldHVybiBfanNwUHJvcGVydHlOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGZpZWxkIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eSwgd2hlbiBub3QgZ2VuZXJhdGluZyBUcmluaWRhZCBjb21wb25lbnRzCi0gICAqCi0gICAqIEBwYXJhbSBmaWVsZFByb3BlcnR5TmFtZSAgdGhlIGZpZWxkIHByb3BlcnR5IG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpZWxkUHJvcGVydHlOYW1lKAotICAgIFN0cmluZyBmaWVsZFByb3BlcnR5TmFtZSkKLSAgewotICAgIF9maWVsZFByb3BlcnR5TmFtZSA9IGZpZWxkUHJvcGVydHlOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZpZWxkIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eSwgd2hlbiBub3QgZ2VuZXJhdGluZyBUcmluaWRhZCBjb21wb25lbnRzCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBmaWVsZCBwcm9wZXJ0eSBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkUHJvcGVydHlOYW1lKCkKLSAgewotICAgIGlmIChfZmllbGRQcm9wZXJ0eU5hbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiAiXyIrZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLSAgICByZXR1cm4gX2ZpZWxkUHJvcGVydHlOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNTZXRNZXRob2QoYm9vbGVhbiBfaXNTZXRNZXRob2QpCi0gIHsKLSAgICB0aGlzLl9pc1NldE1ldGhvZCA9IF9pc1NldE1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzSXNTZXRNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIF9pc1NldE1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzU2V0TWV0aG9kU2NvcGUoU3RyaW5nIF9pc1NldE1ldGhvZFNjb3BlKQotICB7Ci0gICAgdGhpcy5faXNTZXRNZXRob2RTY29wZSA9IF9pc1NldE1ldGhvZFNjb3BlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJc1NldE1ldGhvZFNjb3BlKCkKLSAgewotICAgIHJldHVybiBfaXNTZXRNZXRob2RTY29wZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzR2V0TG9jYWxNZXRob2QoYm9vbGVhbiBfaXNHZXRMb2NhbE1ldGhvZCkKLSAgewotICAgIHRoaXMuX2lzR2V0TG9jYWxNZXRob2QgPSBfaXNHZXRMb2NhbE1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzSXNHZXRMb2NhbE1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gX2lzR2V0TG9jYWxNZXRob2Q7ICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc0dldExvY2FsTWV0aG9kU2NvcGUoU3RyaW5nIF9pc0dldExvY2FsTWV0aG9kU2NvcGUpCi0gIHsKLSAgICB0aGlzLl9pc0dldExvY2FsTWV0aG9kU2NvcGUgPSBfaXNHZXRMb2NhbE1ldGhvZFNjb3BlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJc0dldExvY2FsTWV0aG9kU2NvcGUoKQotICB7Ci0gICAgcmV0dXJuIF9pc0dldExvY2FsTWV0aG9kU2NvcGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSdGV4cHJ2YWx1ZShib29sZWFuIF9ydGV4cHJ2YWx1ZSkKLSAgewotICAgIHRoaXMuX3J0ZXhwcnZhbHVlID0gX3J0ZXhwcnZhbHVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSdGV4cHJ2YWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gX3J0ZXhwcnZhbHVlOwotICB9Ci0gCi0gIHByaXZhdGUgYm9vbGVhbiBfcnRleHBydmFsdWU7Ci0gIHByaXZhdGUgU3RyaW5nIF9pc0dldExvY2FsTWV0aG9kU2NvcGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBfaXNHZXRMb2NhbE1ldGhvZDsKLSAgcHJpdmF0ZSBTdHJpbmcgX2lzU2V0TWV0aG9kU2NvcGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBfaXNTZXRNZXRob2Q7Ci0gIHByaXZhdGUgU3RyaW5nICBfYWxpYXNPZjsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9qc3BQcm9wZXJ0eU5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nICBfZmllbGRQcm9wZXJ0eU5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBfcmVxdWlyZWQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBfbGl0ZXJhbE9ubHk7Ci0gIHByaXZhdGUgYm9vbGVhbiBfc3RhdGVIb2xkZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBfdHJhbnNpZW50OwotICBwcml2YXRlIGJvb2xlYW4gX2xpc3Q7Ci0gIHByaXZhdGUgYm9vbGVhbiBfdGFnQXR0cmlidXRlRXhjbHVkZWQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBfZW51bTsKLSAgcHJpdmF0ZSBib29sZWFuIF91c2VNYXhUaW1lOwotICBwcml2YXRlIFN0cmluZ1tdIF9wcm9wZXJ0eVZhbHVlczsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBfdW5zdXBwb3J0ZWRBZ2VudHMgPSBfRU1QVFlfQVJSQVk7Ci0gIHByaXZhdGUgU3RyaW5nW10gX3Vuc3VwcG9ydGVkUmVuZGVyS2l0cyA9IF9FTVBUWV9BUlJBWTsKLQotICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmdbXSBfRU1QVFlfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUmVuZGVyS2l0QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1JlbmRlcktpdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0NjY2MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUmVuZGVyS2l0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKioKLSAqIFJlbmRlcktpdEJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgcmVuZGVyLWtpdAotICogWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5kZXJLaXRCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBSZW5kZXJLaXRCZWFuLgotICAgKi8KLSAgcHVibGljIFJlbmRlcktpdEJlYW4oKQotICB7Ci0gICAgX3JlbmRlcmVycyA9IG5ldyBUcmVlTWFwKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVuZGVyIGtpdCBpZCBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJLaXRJZCAgdGhlIHJlbmRlciBraXQgaWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbmRlcktpdElkKAotICAgIFN0cmluZyByZW5kZXJLaXRJZCkKLSAgewotICAgIF9yZW5kZXJLaXRJZCA9IHJlbmRlcktpdElkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlbmRlciBraXQgaWQgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXIga2l0IGlkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcktpdElkKCkKLSAgewotICAgIHJldHVybiBfcmVuZGVyS2l0SWQ7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIHJlbmRlcmVyIHRvIHRoaXMgcmVuZGVyIGtpdC4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcmVyICB0aGUgcmVuZGVyZXIgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcigKLSAgICBSZW5kZXJlckJlYW4gcmVuZGVyZXIpCi0gIHsKLSAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5ID0gcmVuZGVyZXIuZ2V0Q29tcG9uZW50RmFtaWx5KCk7Ci0gICAgU3RyaW5nIHJlbmRlcmVyVHlwZSA9IHJlbmRlcmVyLmdldFJlbmRlcmVyVHlwZSgpOwotICAgIFN0cmluZyBjb21wb3NpdGVLZXkgPSBjb21wb25lbnRGYW1pbHkgKyAifCIgKyByZW5kZXJlclR5cGU7Ci0gICAgX3JlbmRlcmVycy5wdXQoY29tcG9zaXRlS2V5LCByZW5kZXJlcik7Ci0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIgPSBnZXRPd25lcigpOwotICAgIGlmIChvd25lciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlbmRlcmVyLmF0dGFjaChvd25lcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIGZvciB0aGlzIGNvbXBvbmVudCBmYW1pbHkgYW5kIHJlbmRlcmVyIHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRGYW1pbHkgIHRoZSBjb21wb25lbnQgZmFtaWx5Ci0gICAqIEBwYXJhbSByZW5kZXJlclR5cGUgICAgIHRoZSByZW5kZXJlciB0eXBlCi0gICAqLwotICBwdWJsaWMgUmVuZGVyZXJCZWFuIGZpbmRSZW5kZXJlcigKLSAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5LAotICAgIFN0cmluZyByZW5kZXJlclR5cGUpCi0gIHsKLSAgICBTdHJpbmcgY29tcG9zaXRlS2V5ID0gY29tcG9uZW50RmFtaWx5ICsgInwiICsgcmVuZGVyZXJUeXBlOwotICAgIHJldHVybiAoUmVuZGVyZXJCZWFuKSBfcmVuZGVyZXJzLmdldChjb21wb3NpdGVLZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlbmRlciBraXQgaGFzIGFueSByZW5kZXJlcnMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIHJlbmRlciBraXQgaGFzIGFueSByZW5kZXJlcnMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1JlbmRlcmVycygpCi0gIHsKLSAgICByZXR1cm4gIV9yZW5kZXJlcnMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCByZW5kZXJlcnMgaW4gdGhpcyByZW5kZXIga2l0LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciByZW5kZXJlcnMoKQotICB7Ci0gICAgcmV0dXJuIF9yZW5kZXJlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRhY2hlcyB0aGUgY29tcG9uZW50IGFuZCBhbGwgZXZlbnQgcmVmZXJlbmNlcy4KLSAgICoKLSAgICogQHBhcmFtIG93bmVyICB0aGUgZmFjZXMgY29uZmlnIG93bmVyCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2goCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyKQotICB7Ci0gICAgc3VwZXIuYXR0YWNoKG93bmVyKTsKLSAgICBJdGVyYXRvciByZW5kZXJlcnMgPSByZW5kZXJlcnMoKTsKLSAgICB3aGlsZSAocmVuZGVyZXJzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBSZW5kZXJlckJlYW4gcmVuZGVyZXIgPSAoUmVuZGVyZXJCZWFuKXJlbmRlcmVycy5uZXh0KCk7Ci0gICAgICByZW5kZXJlci5hdHRhY2gob3duZXIpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgYWRkQWxsUmVuZGVyZXJzKAotICAgIFJlbmRlcktpdEJlYW4gcmVuZGVyS2l0KQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVuZGVyS2l0Ll9yZW5kZXJlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIC8vIHVzZSBhZGRSZW5kZXJlciB0byBlc3RhYmxpc2ggb3duZXIKLSAgICAgIGFkZFJlbmRlcmVyKChSZW5kZXJlckJlYW4paS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nICBfcmVuZGVyS2l0SWQgPSAiIjsKLSAgcHJpdmF0ZSBNYXAgICAgIF9yZW5kZXJlcnM7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUmVuZGVyZXJCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUmVuZGVyZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjVlZTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1JlbmRlcmVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkNvbXBvdW5kSXRlcmF0b3I7Ci0KLS8qKgotICogUmVuZGVyS2l0QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyByZW5kZXIta2l0Ci0gKiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFJlbmRlcmVyQmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgUmVuZGVyZXJCZWFuLgotICAgKi8KLSAgcHVibGljIFJlbmRlcmVyQmVhbigpCi0gIHsKLSAgICBfYXR0cmlidXRlcyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgX2ZhY2V0cyA9IG5ldyBUcmVlTWFwKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRGYW1pbHkgIHRoZSBjb21wb25lbnQgZmFtaWx5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRGYW1pbHkoCi0gICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSkKLSAgewotICAgIF9jb21wb25lbnRGYW1pbHkgPSBjb21wb25lbnRGYW1pbHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgZmFtaWx5Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudEZhbWlseSgpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudEZhbWlseTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSAgdGhlIHJlbmRlcmVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbmRlcmVyVHlwZSgKLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICB7Ci0gICAgX3JlbmRlcmVyVHlwZSA9IHJlbmRlcmVyVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlcmVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkKLSAgewotICAgIHJldHVybiBfcmVuZGVyZXJUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlbmRlcmVyIGNsYXNzIGZvciB0aGlzIHJlbmRlcmVyLgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyZXJDbGFzcyAgdGhlIHJlbmRlcmVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlckNsYXNzKAotICAgIFN0cmluZyByZW5kZXJlckNsYXNzKQotICB7Ci0gICAgX3JlbmRlcmVyQ2xhc3MgPSByZW5kZXJlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIGNsYXNzIGZvciB0aGlzIHJlbmRlcmVyLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX3JlbmRlcmVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlICB0aGUgY29tcG9uZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoCi0gICAgU3RyaW5nIGNvbXBvbmVudFR5cGUpCi0gIHsKLSAgICBfY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVuZGVyZXIgc3VwZXJjbGFzcyBmb3IgdGhpcyByZW5kZXJlci4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcmVyU3VwZXJjbGFzcyAgdGhlIHJlbmRlcmVyIHN1cGVyY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbmRlcmVyU3VwZXJjbGFzcygKLSAgICBTdHJpbmcgcmVuZGVyZXJTdXBlcmNsYXNzKQotICB7Ci0gICAgX3JlbmRlcmVyU3VwZXJjbGFzcyA9IHJlbmRlcmVyU3VwZXJjbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciBzdXBlcmNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlcmVyIHN1cGVyY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJTdXBlcmNsYXNzKCkKLSAgewotICAgIHJldHVybiBfcmVuZGVyZXJTdXBlcmNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSByZW5kZXJlci1zcGVjaWZpYyBjb21wb25lbnQgY2xhc3MgZm9yIHRoaXMgcmVuZGVyZXIuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlci1zcGVjaWZjIGNvbXBvbmVudCBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaW5kQ29tcG9uZW50Q2xhc3MoKQotICB7Ci0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgIHJldHVybiAoY29tcG9uZW50ICE9IG51bGwpID8gY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LlVJWENvbXBvbmVudCI7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIGJlaGF2aW9yYWwgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIHJlbmRlcmVyLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYmVoYXZpb3JhbCBjb21wb25lbnQgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmluZENvbXBvbmVudEZhbWlseUNsYXNzKCkKLSAgewotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICBDb21wb25lbnRCZWFuIGJlaGF2aW9yYWwgPSAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb21wb25lbnQuZmluZEJlaGF2aW9yYWxDb21wb25lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDsKLSAgICByZXR1cm4gKGJlaGF2aW9yYWwgIT0gbnVsbCkgPyBiZWhhdmlvcmFsLmdldENvbXBvbmVudENsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5VSVhDb21wb25lbnQiOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBhdHRyaWJ1dGUgdG8gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGUgIHRoZSBhdHRyaWJ1dGUgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoCi0gICAgQXR0cmlidXRlQmVhbiBhdHRyaWJ1dGUpCi0gIHsKLSAgICBfYXR0cmlidXRlcy5wdXQoYXR0cmlidXRlLmdldEF0dHJpYnV0ZU5hbWUoKSwgYXR0cmlidXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZm9yIHRoaXMgYXR0cmlidXRlIG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lICB0aGUgYXR0cmlidXRlIG5hbWUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZUJlYW4gZmluZEF0dHJpYnV0ZSgKLSAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIEF0dHJpYnV0ZUJlYW4gYXR0cmlidXRlID0gKEF0dHJpYnV0ZUJlYW4pX2F0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCi0gICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgYXR0cmlidXRlID0gY29tcG9uZW50LmZpbmRQcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYXR0cmlidXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGF0dHJpYnV0ZXMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGF0dHJpYnV0ZXMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKQotICB7Ci0gICAgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzID0gIV9hdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQotICAgIGlmICghaGFzQXR0cmlidXRlcykKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgIGhhc0F0dHJpYnV0ZXMgfD0gY29tcG9uZW50Lmhhc1Byb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFzQXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IGNvbXBvbmVudCBzdXBlcnR5cGUKLSAgICogaGFzIGFueSBhdHRyaWJ1dGVzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IHN1cGVydHlwZSBoYXMgYW55IGF0dHJpYnV0ZXMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzID0gaGFzQXR0cmlidXRlcygpOwotCi0gICAgaWYgKCFoYXNBdHRyaWJ1dGVzICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGNvbXBvbmVudC5yZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICBoYXNBdHRyaWJ1dGVzIHw9IHBhcmVudC5oYXNQcm9wZXJ0aWVzKHRydWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBoYXNBdHRyaWJ1dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBhdHRyaWJ1dGVzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBhdHRyaWJ1dGVzKCkKLSAgewotICAgIEl0ZXJhdG9yIGF0dHJpYnV0ZXMgPSBfYXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBDb21wb3VuZEl0ZXJhdG9yKGF0dHJpYnV0ZXMsIGNvbXBvbmVudC5wcm9wZXJ0aWVzKCkpOwotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYXR0cmlidXRlcyBvbiB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgb2YgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBzdXBlcnR5cGUsCi0gICAqICAgICAgICAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBhdHRyaWJ1dGVzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIEl0ZXJhdG9yIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzKCk7Ci0gICAgaWYgKGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGNvbXBvbmVudC5yZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IoYXR0cmlidXRlcywgcGFyZW50LnByb3BlcnRpZXModHJ1ZSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgZmFjZXQgdG8gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBmYWNldCAgdGhlIGZhY2V0IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRmFjZXQoCi0gICAgRmFjZXRCZWFuIGZhY2V0KQotICB7Ci0gICAgX2ZhY2V0cy5wdXQoZmFjZXQuZ2V0RmFjZXROYW1lKCksIGZhY2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmYWNldCBmb3IgdGhpcyBmYWNldCBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gZmFjZXROYW1lICB0aGUgZmFjZXQgbmFtZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgRmFjZXRCZWFuIGZpbmRGYWNldCgKLSAgICBTdHJpbmcgZmFjZXROYW1lKQotICB7Ci0gICAgcmV0dXJuIChGYWNldEJlYW4pX2ZhY2V0cy5nZXQoZmFjZXROYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBmYWNldHMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGZhY2V0cywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRmFjZXRzKCkKLSAgewotICAgIGJvb2xlYW4gaGFzRmFjZXRzID0gIV9mYWNldHMuaXNFbXB0eSgpOwotCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgIGhhc0ZhY2V0cyB8PSBjb21wb25lbnQuaGFzRmFjZXRzKCk7Ci0KLSAgICByZXR1cm4gaGFzRmFjZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgY29tcG9uZW50IHN1cGVydHlwZQotICAgKiBoYXMgYW55IGZhY2V0cy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBmYWNldHMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZhY2V0cygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBib29sZWFuIGhhc0ZhY2V0cyA9IGhhc0ZhY2V0cygpOwotCi0gICAgaWYgKCFoYXNGYWNldHMgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gY29tcG9uZW50LnJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgIGhhc0ZhY2V0cyB8PSBwYXJlbnQuaGFzRmFjZXRzKHRydWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBoYXNGYWNldHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGZhY2V0cyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBmYWNldHMoKQotICB7Ci0gICAgSXRlcmF0b3IgZmFjZXRzID0gX2ZhY2V0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgZmFjZXRzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IoZmFjZXRzLCBjb21wb25lbnQuZmFjZXRzKCkpOwotCi0gICAgcmV0dXJuIGZhY2V0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBmYWNldHMgb24gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZgotICAqICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLAotICAqICAgICAgICAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICoKLSAgKiBAcmV0dXJuICB0aGUgZmFjZXQgaXRlcmF0b3IKLSAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGZhY2V0cygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBJdGVyYXRvciBmYWNldHMgPSBmYWNldHMoKTsKLSAgICBpZiAoZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gY29tcG9uZW50LnJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgIGZhY2V0cyA9IG5ldyBDb21wb3VuZEl0ZXJhdG9yKGZhY2V0cywgcGFyZW50LmZhY2V0cyh0cnVlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWNldHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgaW5zdGFuY2UuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgdHlwZSBpbnN0YW5jZQotICAgKi8KLSAgcHVibGljIENvbXBvbmVudEJlYW4gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKQotICB7Ci0gICAgaWYgKF9jb21wb25lbnRUeXBlID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lciA9IGdldE93bmVyKCk7Ci0gICAgcmV0dXJuIChvd25lciAhPSBudWxsKSA/IG93bmVyLmZpbmRDb21wb25lbnQoX2NvbXBvbmVudFR5cGUpIDogbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nICBfZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nICBfY29tcG9uZW50RmFtaWx5OwotICBwcml2YXRlIFN0cmluZyAgX3JlbmRlcmVyVHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJlckNsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX3JlbmRlcmVyU3VwZXJjbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRUeXBlOwotICBwcml2YXRlIE1hcCAgICAgX2F0dHJpYnV0ZXM7Ci0gIHByaXZhdGUgTWFwICAgICBfZmFjZXRzOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1ZhbGlkYXRvckJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9WYWxpZGF0b3JCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNGE4YmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1ZhbGlkYXRvckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogVmFsaWRhdG9yQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyB2YWxpZGF0b3IKLSAqIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yQmVhbiBleHRlbmRzIEFic3RyYWN0VGFnQmVhbiB7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbGlkYXRvciBpZGVudGlmZXIgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdmFsaWRhdG9ySWQgIHZhbGlkYXRvciBpZGVudGlmZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcklkKAotICAgIFN0cmluZyB2YWxpZGF0b3JJZCkKLSAgewotICAgIF92YWxpZGF0b3JJZCA9IHZhbGlkYXRvcklkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIGlkZW50aWZpZXIgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgZmFsc2UuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpZGVudGlmaWVyIGlzIHNwZWNpZmllZCwKLSAgICogICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzVmFsaWRhdG9ySWQoKQotICB7Ci0gICAgcmV0dXJuIChfdmFsaWRhdG9ySWQgIT0gbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsaWRhdG9yIGlkZW50aWZpZXIgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdmFsaWRhdG9yIGlkZW50aWZpZXIKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9ySWQoKQotICB7Ci0gICAgcmV0dXJuIF92YWxpZGF0b3JJZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWxpZGF0b3IgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3MgIHRoZSB2YWxpZGF0b3IgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvckNsYXNzKAotICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcykKLSAgewotICAgIF92YWxpZGF0b3JDbGFzcyA9IHZhbGlkYXRvckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbGlkYXRvciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB2YWxpZGF0b3IgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF92YWxpZGF0b3JDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWxpZGF0b3Igc3VwZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdmFsaWRhdG9yU3VwZXJDbGFzcyAgdGhlIHZhbGlkYXRvciBzdXBlciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yU3VwZXJDbGFzcygKLSAgICBTdHJpbmcgdmFsaWRhdG9yU3VwZXJDbGFzcykKLSAgewotICAgIF92YWxpZGF0b3JTdXBlckNsYXNzID0gdmFsaWRhdG9yU3VwZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0b3Igc3VwZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdmFsaWRhdG9yIHN1cGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvclN1cGVyQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF92YWxpZGF0b3JTdXBlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVyIHRvIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RpZmllciAgdGhlIG1vZGlmaWVyIHRvIGJlIGFkZGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0b3JDbGFzc01vZGlmaWVyKAotICAgIGludCBtb2RpZmllcikKLSAgewotICAgIF92YWxpZGF0b3JDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQnkgZGVmYXVsdCwgdGhlc2UgbW9kaWZpZXJzIGluY2x1ZGUgTW9kaWZpZXIuUFVCTElDLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB2YWxpZGF0b3IgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdG9yQ2xhc3NNb2RpZmllcnMoKQotICB7Ci0gICAgaW50IG1vZGlmaWVycyA9IF92YWxpZGF0b3JDbGFzc01vZGlmaWVyczsKLQotICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0gICAgewotICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kaWZpZXJzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFyc2VWYWxpZGF0b3JDbGFzc01vZGlmaWVyKAotICAgIFN0cmluZyBtb2RpZmllcikKLSAgewotICAgIGFkZFZhbGlkYXRvckNsYXNzTW9kaWZpZXIoX3BhcnNlTW9kaWZpZXIobW9kaWZpZXIpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGFnQ2xhc3NFeGNsdWRlZChib29sZWFuIHRhZ0NsYXNzRXhjbHVkZWQpCi0gIHsKLSAgICBfdGFnQ2xhc3NFeGNsdWRlZCA9IHRhZ0NsYXNzRXhjbHVkZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1RhZ0NsYXNzRXhjbHVkZWQoKQotICB7Ci0gICAgcmV0dXJuIF90YWdDbGFzc0V4Y2x1ZGVkOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgIF92YWxpZGF0b3JJZDsKLSAgcHJpdmF0ZSBTdHJpbmcgIF92YWxpZGF0b3JDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF92YWxpZGF0b3JTdXBlckNsYXNzOwotICBwcml2YXRlIGludCAgICAgX3ZhbGlkYXRvckNsYXNzTW9kaWZpZXJzOwotICBwcml2YXRlIGJvb2xlYW4gX3RhZ0NsYXNzRXhjbHVkZWQ7Ci0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoVmFsaWRhdG9yQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL2NvbnZlcnRlcnMvUU5hbWVDb252ZXJ0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9jb252ZXJ0ZXJzL1FOYW1lQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjlhNDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL2NvbnZlcnRlcnMvUU5hbWVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5jb252ZXJ0ZXJzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFFOYW1lQ29udmVydGVyIGltcGxlbWVudHMgQ29udmVydGVyCi17Ci0gIHB1YmxpYyBPYmplY3QgY29udmVydCgKLSAgICBDbGFzcyAgdHlwZSwKLSAgICBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBDb252ZXJzaW9uRXhjZXB0aW9uKCJNaXNzaW5nIHZhbHVlIik7Ci0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBRTmFtZSkKLSAgICAgIHJldHVybiB2YWx1ZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBRTmFtZS52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvbnZlcnNpb25FeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkKLSAgewotICAgIENvbnZlcnRVdGlscy5yZWdpc3RlcihuZXcgUU5hbWVDb252ZXJ0ZXIoKSwgUU5hbWUuY2xhc3MpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvcnVsZXMvQmVhblByb3BlcnR5U2V0dGVyUnVsZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL3J1bGVzL0JlYW5Qcm9wZXJ0eVNldHRlclJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwM2IxNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvcnVsZXMvQmVhblByb3BlcnR5U2V0dGVyUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLnJ1bGVzOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5jb252ZXJ0ZXJzLlFOYW1lQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQmVhblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuUHJvcGVydHlVdGlsczsKLQotCi0vKioKLSAqIEV4dGVuZHMgQXBhY2hlIENvbW1vbnMgRGlnZXN0ZXIgQmVhblByb3BlcnR5U2V0dGVyUnVsZSB0byBhZGQgUU5hbWUgc3VwcG9ydC4KLSAqCi0gKiBBIFFOYW1lIGNvbnZldGVyIGlzIG5vdCBzdWZmaWNpZW50IGJlY2F1c2UgaXQgcmVxdWlyZXMgY29udGV4dHVhbAotICoga25vd2xlZGdlIG9mIHRoZSBjdXJyZW50IHByZWZpeC10by1uYW1lc3BhY2UgbWFwcGluZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlCi0gICAgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuQmVhblByb3BlcnR5U2V0dGVyUnVsZQotewotICBwdWJsaWMgQmVhblByb3BlcnR5U2V0dGVyUnVsZSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgc3VwZXIocHJvcGVydHlOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVuZCgKLSAgICBTdHJpbmcgbmFtZXNwYWNlLAotICAgIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBPYmplY3QgdG9wID0gZGlnZXN0ZXIucGVlaygpOwotCi0gICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQotICAgICAgICAgIFByb3BlcnR5VXRpbHMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHRvcCwgcHJvcGVydHlOYW1lKTsKLQotICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigiTWlzc2luZyBiZWFuIHByb3BlcnR5IFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSArICJcIiIpOwotICAgIH0KLQotICAgIENsYXNzIHByb3BlcnR5VHlwZSA9IGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCk7Ci0KLSAgICBpZiAoUU5hbWUuY2xhc3MuZXF1YWxzKHByb3BlcnR5VHlwZSkpCi0gICAgewotICAgICAgaW50IGNvbG9uID0gYm9keVRleHQuaW5kZXhPZignOicpOwotICAgICAgaWYgKGNvbG9uICE9IC0xKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gZGlnZXN0ZXIuZmluZE5hbWVzcGFjZVVSSShib2R5VGV4dC5zdWJzdHJpbmcoMCwgY29sb24pKTsKLSAgICAgICAgYm9keVRleHQgPSAieyIgKyBuYW1lc3BhY2VVUkkgKyAifSIgKyBib2R5VGV4dC5zdWJzdHJpbmcoY29sb24gKyAxKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGJvZHlUZXh0LmluZGV4T2YoJ3snKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGRpZ2VzdGVyLmZpbmROYW1lc3BhY2VVUkkoIiIpOwotICAgICAgICBib2R5VGV4dCA9ICJ7IiArIG5hbWVzcGFjZVVSSSArICJ9IiArIGJvZHlUZXh0LnN1YnN0cmluZyhjb2xvbiArIDEpOwotICAgICAgfQotICAgICAgQmVhblV0aWxzLnNldFByb3BlcnR5KHRvcCwgcHJvcGVydHlOYW1lLCBib2R5VGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5lbmQobmFtZXNwYWNlLCBuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMKLSAgewotICAgIFFOYW1lQ29udmVydGVyLnJlZ2lzdGVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0F0dHJpYnV0ZUZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YWNiYjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQXR0cmlidXRlQmVhbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEF0dHJpYnV0ZUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaikKLSAgewotICAgIHJldHVybiBhY2NlcHQoKEF0dHJpYnV0ZUJlYW4pb2JqKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICBBdHRyaWJ1dGVCZWFuIGF0dHJpYnV0ZSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db21wb25lbnRGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbXBvbmVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU0N2UyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbXBvbmVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDb21wb25lbnRGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopCi0gIHsKLSAgICByZXR1cm4gYWNjZXB0KChDb21wb25lbnRCZWFuKW9iaik7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29tcG91bmRJdGVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29tcG91bmRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZkYzJjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbXBvdW5kSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIENvbXBvdW5kSXRlcmF0b3IgY29uc3VtZXMgdGhlIGluaXRpYWwgaXRlcmF0b3IgYmVmb3JlCi0gKiBvYnNlcnZpbmcgdGhlIG5leHQgaXRlcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3VuZEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IKLXsKLSAgcHVibGljIENvbXBvdW5kSXRlcmF0b3IoCi0gICAgSXRlcmF0b3IgcHJpbWFyeSwKLSAgICBJdGVyYXRvciBzZWNvbmRhcnkpCi0gIHsKLSAgICB0aGlzKG5ldyBJdGVyYXRvcltdIHtwcmltYXJ5LCBzZWNvbmRhcnl9KTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3VuZEl0ZXJhdG9yKAotICAgIEl0ZXJhdG9yW10gaXRlcmF0b3JzKQotICB7Ci0gICAgX2l0ZXJhdG9ycyA9IGl0ZXJhdG9yczsKLSAgICBfaW5kZXggPSAwOwotICAgIF9hZHZhbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgewotICAgIHJldHVybiAoX25leHQgIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IG5leHQoKQotICB7Ci0gICAgaWYgKF9uZXh0ID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCi0gICAgT2JqZWN0IG9iaiA9IF9uZXh0OwotICAgIF9hZHZhbmNlKCk7Ci0gICAgcmV0dXJuIG9iajsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZSgpCi0gIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfYWR2YW5jZSgpCi0gIHsKLSAgICBJdGVyYXRvciBjdXJyZW50ID0gX2l0ZXJhdG9yc1tfaW5kZXhdOwotICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgIWN1cnJlbnQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIF9pbmRleCArKzsKLSAgICAgIGN1cnJlbnQgPSAoX2luZGV4IDwgX2l0ZXJhdG9ycy5sZW5ndGgpID8gX2l0ZXJhdG9yc1tfaW5kZXhdIDogbnVsbDsKLSAgICB9Ci0KLSAgICBfbmV4dCA9IChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5oYXNOZXh0KCkpID8gY3VycmVudC5uZXh0KCkgOiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBPYmplY3QgX25leHQ7Ci0gIHByaXZhdGUgSXRlcmF0b3JbXSBfaXRlcmF0b3JzOwotICBwcml2YXRlIGludCBfaW5kZXg7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db252ZXJ0ZXJGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbnZlcnRlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWMzODUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbnZlcnRlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbnZlcnRlckJlYW47Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopCi0gIHsKLSAgICByZXR1cm4gYWNjZXB0KChDb252ZXJ0ZXJCZWFuKW9iaik7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmFjZXRGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZhY2V0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjVmMmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmFjZXRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5GYWNldEJlYW47Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBGYWNldEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaikKLSAgewotICAgIHJldHVybiBhY2NlcHQoKEZhY2V0QmVhbilvYmopOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgIEZhY2V0QmVhbiBmYWNldCk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzgzYmI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyCi17Ci0gIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZpbHRlcmVkSXRlcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZpbHRlcmVkSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2MGM3Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GaWx0ZXJlZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZpbHRlcmVkSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgotewotICBwdWJsaWMgRmlsdGVyZWRJdGVyYXRvcigKLSAgICBJdGVyYXRvciBpdGVyLAotICAgIEZpbHRlciAgIGZpbHRlcikKLSAgewotICAgIF9pdGVyID0gaXRlcjsKLSAgICBfZmlsdGVyID0gZmlsdGVyOwotICAgIF9hZHZhbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgewotICAgIHJldHVybiAoX25leHQgIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IG5leHQoKQotICB7Ci0gICAgaWYgKF9uZXh0ID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCi0gICAgT2JqZWN0IG9iaiA9IF9uZXh0OwotICAgIF9hZHZhbmNlKCk7Ci0gICAgcmV0dXJuIG9iajsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZSgpCi0gIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfYWR2YW5jZSgpCi0gIHsKLSAgICB3aGlsZSAoX2l0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBfaXRlci5uZXh0KCk7Ci0gICAgICBpZiAoX2ZpbHRlci5hY2NlcHQob2JqKSkKLSAgICAgIHsKLSAgICAgICAgX25leHQgPSBvYmo7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBfbmV4dCA9IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yIF9pdGVyOwotICBwcml2YXRlIGZpbmFsIEZpbHRlciBfZmlsdGVyOwotICBwcml2YXRlIE9iamVjdCBfbmV4dDsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1Byb3BlcnR5RmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Qcm9wZXJ0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmZjNTkzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1Byb3BlcnR5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgUHJvcGVydHlGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopCi0gIHsKLSAgICByZXR1cm4gYWNjZXB0KChQcm9wZXJ0eUJlYW4pb2JqKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvUmVuZGVyZXJGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1JlbmRlcmVyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2Q0ZWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvUmVuZGVyZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5SZW5kZXJlckJlYW47Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBSZW5kZXJlckZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaikKLSAgewotICAgIHJldHVybiBhY2NlcHQoKFJlbmRlcmVyQmVhbilvYmopOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgIFJlbmRlcmVyQmVhbiByZW5kZXJlcik7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Tb3J0ZWRJdGVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvU29ydGVkSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOGNkMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Tb3J0ZWRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogU29ydGVkSXRlcmF0b3IgcHJlc2VudHMgdGhlIGVsZW1lbnRzIG9mIGFub3RoZXIgaXRlcmF0b3IgaW4gYSBzb3J0ZWQgb3JkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3J0ZWRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCi17Ci0gIHB1YmxpYyBTb3J0ZWRJdGVyYXRvcigKLSAgICBJdGVyYXRvciB1bnNvcnRlZCkKLSAgewotICAgICAvLyB0aGlzIGltcGxlbWVudGF0aW9uIGp1c3QgcHVsbHMgdGhlIGVudGlyZSBjb250ZW50cyBpbnRvIGEgbGlzdCAtLQotICAgICAvLyBpdCB3aWxsIGJlIGF3a3dhcmQgaWYgdGhlIHVuc29ydGVkIGl0ZXJhdG9yIGlzIGluZmluaXRlCi0gICAgIEFycmF5TGlzdCBzb3J0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICB3aGlsZSh1bnNvcnRlZC5oYXNOZXh0KCkpCi0gICAgIHsKLSAgICAgICBzb3J0ZWRMaXN0LmFkZCh1bnNvcnRlZC5uZXh0KCkpOwotICAgICB9Ci0gICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkTGlzdCk7Ci0gICAgIF9zb3J0ZWQgPSBzb3J0ZWRMaXN0Lml0ZXJhdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgewotICAgIHJldHVybiBfc29ydGVkLmhhc05leHQoKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgbmV4dCgpCi0gIHsKLSAgICByZXR1cm4gX3NvcnRlZC5uZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmUoKQotICB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yIF9zb3J0ZWQ7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1NvdXJjZVRlbXBsYXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Tb3VyY2VUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDI5ZWRkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1NvdXJjZVRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VUZW1wbGF0ZQotewotICBwdWJsaWMgU291cmNlVGVtcGxhdGUoRmlsZSBmaWxlKQotICB7Ci0gICAgX2ZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3Vic3RpdHV0ZShTdHJpbmcgaW4sIFN0cmluZyBvdXQpCi0gIHsKLSAgICBfc3Vic3RpdHV0aW9ucy5wdXQoaW4sIG91dCk7Ci0gIH0KLQotICBwdWJsaWMgU2V0IGdldEltcG9ydHMoKQotICB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW1wb3J0cyk7Ci0gIH0KLQotICBwdWJsaWMgU2V0IGdldEltcGxlbWVudHMoKQotICB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW1wbGVtZW50cyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkUHJlZmFjZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgX3JlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihfZmlsZSkpOwotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIFN0cmluZyBsaW5lID0gX3JlYWRlci5yZWFkTGluZSgpOwotICAgICAgaWYgKGxpbmUgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigiRmlsZSAiICsgX2ZpbGUgKyAiIGVuZGVkIHByZW1hdHVyZWx5Iik7Ci0KLSAgICAgIGlmIChsaW5lLmVxdWFscygieyIpKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiaW1wb3J0ICIpKQotICAgICAgewotICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgIFN0cmluZyBpbXBvcnRlZCA9IGxpbmUuc3Vic3RyaW5nKCJpbXBvcnQgIi5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICBfaW1wb3J0cy5hZGQoaW1wb3J0ZWQpOwotICAgICAgICBfZnFjbk1hcC5wdXQoVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoaW1wb3J0ZWQpLCBpbXBvcnRlZCk7Ci0gICAgICB9Ci0KLSAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZigiIGltcGxlbWVudHMgIik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjbGF1c2UgPSBsaW5lLnN1YnN0cmluZyhpbmRleCArICIgaW1wbGVtZW50cyAiLmxlbmd0aCgpKTsKLSAgICAgICAgU3RyaW5nW10gaW50ZXJmYWNlcyA9IGNsYXVzZS5zcGxpdCgiLCAiKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBpbnRlcmZhY2VzW2ldOwotICAgICAgICAgIGlmICghVXRpbC5pc0Z1bGxDbGFzcyhjbGFzc05hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZE5hbWUgPSAoU3RyaW5nKV9mcWNuTWFwLmdldChjbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKGltcG9ydGVkTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICBjbGFzc05hbWUgPSBpbXBvcnRlZE5hbWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIF9pbXBsZW1lbnRzLmFkZChjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUNvbnRlbnQoV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbGluZSA9IF9yZWFkZXIucmVhZExpbmUoKTsKLSAgICAgIGlmIChsaW5lID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIkZpbGUgIiArIF9maWxlICsgIiBlbmRlZCBwcmVtYXR1cmVseSIpOwotCi0gICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aChfSUdOT1JFX1BSRUZJWCkpewotICAgICAgICAgIGlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKF9JR05PUkVfUFJFRklYMikpewotICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kID0gbGluZS50cmltKCkuc3Vic3RyaW5nKF9JR05PUkVfUFJFRklYMi5sZW5ndGgoKSkudHJpbSgpOwotICAgICAgICAgICAgICBpZiAobWV0aG9kLmxlbmd0aCgpID4gMCApewotICAgICAgICAgICAgICAgICAgX2lnbm9yZU1ldGhvZHMuYWRkKG1ldGhvZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChsaW5lLmVxdWFscygifSIpKQotICAgICAgICBicmVhazsKLQotICAgICAgbGluZSA9IF9zdWJzdGl0dXRlKGxpbmUpOwotICAgICAgb3V0LndyaXRlKGxpbmUpOwotICAgICAgb3V0LndyaXRlKCJcbiIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfc3Vic3RpdHV0ZShTdHJpbmcgaW4pCi0gIHsKLSAgICBJdGVyYXRvciBrZXlzID0gX3N1YnN0aXR1dGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgX3N1YnN0aXR1dGlvbnMuZ2V0KGtleSk7Ci0gICAgICBpbiA9IF9zdWJzdGl0dXRlKGluLCBrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW47Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgX3N1YnN0aXR1dGUoU3RyaW5nIGluLCBTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKQotICB7Ci0gICAgaW50IGluZGV4ID0gaW4uaW5kZXhPZihmcm9tKTsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgcmV0dXJuIGluOwotCi0gICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoaW4ubGVuZ3RoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLmxlbmd0aCgpIC0gZnJvbS5sZW5ndGgoKSk7Ci0gICAgYnVmZmVyLmFwcGVuZChpbi5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLSAgICBidWZmZXIuYXBwZW5kKHRvKTsKLSAgICBTdHJpbmcgc3VmZml4ID0gaW4uc3Vic3RyaW5nKGluZGV4ICsgZnJvbS5sZW5ndGgoKSk7Ci0gICAgYnVmZmVyLmFwcGVuZChfc3Vic3RpdHV0ZShzdWZmaXgsIGZyb20sIHRvKSk7Ci0KLSAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldElnbm9yZU1ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiBfaWdub3JlTWV0aG9kczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgICAgICAgICAgIF9maWxlOwotICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIF9yZWFkZXI7Ci0gIHByaXZhdGUgU2V0ICAgICAgICAgICAgX2ltcG9ydHMgPSBuZXcgSGFzaFNldCgpOwotICBwcml2YXRlIE1hcCAgICAgICAgICAgIF9mcWNuTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBTZXQgICAgICAgICAgICBfaW1wbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0gIHByaXZhdGUgTWFwICAgICAgICAgICAgX3N1YnN0aXR1dGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICBwcml2YXRlIFNldCAgICAgICAgICAgIF9pZ25vcmVNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKLQotICAvLyBNYWdpYyBzeW50YXggaW5kaWNhdGluZyAicGxlYXNlIGlnbm9yZSB0aGlzIGxpbmUiCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfSUdOT1JFX1BSRUZJWCA9ICIvKiovIjsKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9JR05PUkVfUFJFRklYMiA9ICIvKiovLy8iOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvVXRpbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTlmYmFlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgVXRpbAotewotICBzdGF0aWMgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgoCi0gICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICBTdHJpbmcgZmlsZUV4dGVuc2lvbikKLSAgewotICAgIHJldHVybiAoY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgZmlsZUV4dGVuc2lvbik7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNGdWxsQ2xhc3MoCi0gICAgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIHJldHVybiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmluZGV4T2YoJy4nKSAhPSAtMSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHZW5lcmljc0Zyb21Qcm9wZXJ0eShQcm9wZXJ0eUJlYW4gcHJvcGVydHkpewotICAgICAgU3RyaW5nIGdlbiA9ICIiOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eS5nZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKS5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGlmIChpPjApewotICAgICAgICAgICAgICBnZW4gKz0gIiwiOwotICAgICAgICAgIH0KLSAgICAgICAgICBnZW4gKz0gZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5LmdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpW2ldKTsgICAgICAgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gKGdlbi5sZW5ndGgoKSA+IDA/IjwiK2dlbisiPiI6Z2VuKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldENsYXNzRnJvbUZ1bGxDbGFzcygKLSAgICBTdHJpbmcgZnVsbENsYXNzKQotICB7Ci0gICAgaWYgKGZ1bGxDbGFzcyA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBpbnQgbGFzdFNlcCA9IGZ1bGxDbGFzcy5sYXN0SW5kZXhPZignLicpOwotICAgIC8vIE5vdGU6IHRoaXMgY29kZSBhbHNvIHdvcmtzIGZvciB0aGUgZW1wdHkgcGFja2FnZQotICAgIHJldHVybiAoZnVsbENsYXNzLnN1YnN0cmluZyhsYXN0U2VwICsgMSkpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoCi0gICAgU3RyaW5nIGZ1bGxDbGFzcykKLSAgewotICAgIGlmIChmdWxsQ2xhc3MgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaW50IGxhc3RTZXAgPSBmdWxsQ2xhc3MubGFzdEluZGV4T2YoJy4nKTsKLQotICAgIC8vIGRldGVjdCB0aGUgZW1wdHkgcGFja2FnZQotICAgIGlmIChsYXN0U2VwID09IC0xKQotICAgICAgcmV0dXJuICIiOwotCi0gICAgcmV0dXJuIChmdWxsQ2xhc3Muc3Vic3RyaW5nKDAsIGxhc3RTZXApKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIGdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgU3RyaW5nIGNvbnN0YW50U3VmZml4KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGNvbnN0YW50TmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGZvciAoaW50IGk9MDsgaSA8IHByb3BlcnR5TmFtZS5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgY2ggPSBwcm9wZXJ0eU5hbWUuY2hhckF0KGkpOwotICAgICAgaWYgKGkgPiAwICYmCi0gICAgICAgICAgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGNoKSAmJgotICAgICAgICAgIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShwcm9wZXJ0eU5hbWUuY2hhckF0KGktMSkpKQotICAgICAgewotICAgICAgICBjb25zdGFudE5hbWUuYXBwZW5kKCdfJyk7Ci0gICAgICB9Ci0gICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7Ci0gICAgICBjb25zdGFudE5hbWUuYXBwZW5kKGNoKTsKLSAgICB9Ci0KLSAgICBpZiAoY29uc3RhbnRTdWZmaXggIT0gbnVsbCkKLSAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoY29uc3RhbnRTdWZmaXgpOwotCi0gICAgcmV0dXJuIGNvbnN0YW50TmFtZS50b1N0cmluZygpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoCi0gICAgU3RyaW5nIHByZWZpeCwKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIHByZWZpeCArIENoYXJhY3Rlci50b1VwcGVyQ2FzZShwcm9wZXJ0eU5hbWUuY2hhckF0KDApKSArCi0gICAgICAgICAgIHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5Q2xhc3MoUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgU3RyaW5nIHByb3BlcnR5RnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpOwotICAgIFN0cmluZ1tdIGdlbmVyaWNUeXBlcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCk7Ci0gICAgaWYoZ2VuZXJpY1R5cGVzICE9IG51bGwgJiYgZ2VuZXJpY1R5cGVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNjApOwotICAgICAgYnVmZmVyLmFwcGVuZChwcm9wZXJ0eUNsYXNzKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoJzwnKTsKLSAgICAgIGludCBtYXggPSBnZW5lcmljVHlwZXMubGVuZ3RoIC0gMTsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gbWF4OyBpKyspCi0gICAgICB7Ci0gICAgICAgIF9idWlsZFByb3BlcnR5Q2xhc3MoYnVmZmVyLCBnZW5lcmljVHlwZXNbaV0pOwotICAgICAgICBpZihpIDwgbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotICAgICAgCi0gICAgICBwcm9wZXJ0eUNsYXNzID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBwcm9wZXJ0eUNsYXNzOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZUZyb21FdmVudCgKLSAgICBTdHJpbmcgbWV0aG9kUHJlZml4LAotICAgIFN0cmluZyBldmVudE5hbWUsCi0gICAgU3RyaW5nIG1ldGhvZFN1ZmZpeCkKLSAgewotICAgIHJldHVybiBtZXRob2RQcmVmaXggKwotICAgICAgICAgICBDaGFyYWN0ZXIudG9VcHBlckNhc2UoZXZlbnROYW1lLmNoYXJBdCgwKSkgKwotICAgICAgICAgICBldmVudE5hbWUuc3Vic3RyaW5nKDEpICsKLSAgICAgICAgICAgbWV0aG9kU3VmZml4OwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kUmVhZGVyRnJvbVByb3BlcnR5KAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MpCi0gIHsKLSAgICBTdHJpbmcgbWV0aG9kUHJlZml4ID0gKCJib29sZWFuIi5lcXVhbHMocHJvcGVydHlDbGFzcykgPyAiaXMiIDogImdldCIpOwotICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5TmFtZShtZXRob2RQcmVmaXgsIHByb3BlcnR5TmFtZSk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWVGcm9tRXZlbnRUeXBlKAotICAgIFN0cmluZyBldmVudEZ1bGxDbGFzcykKLSAgewotICAgIFN0cmluZyBldmVudE5hbWUgPSBnZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZXZlbnRGdWxsQ2xhc3MpOwotICAgIHJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoZXZlbnROYW1lLmNoYXJBdCgwKSkgKwotICAgICAgICAgICBldmVudE5hbWUuc3Vic3RyaW5nKDEsIGV2ZW50TmFtZS5sZW5ndGgoKSk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmVDbGFzcygKLSAgICBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgcmV0dXJuICJib29sZWFuIi5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAiYnl0ZSIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgImNoYXIiLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICJkb3VibGUiLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgImludCIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgImxvbmciLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICJzaG9ydCIuZXF1YWxzKGNsYXNzTmFtZSk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZVByb3BlcnR5Q2xhc3MoUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNjApOwotICAgIF9idWlsZFByb3BlcnR5Q2xhc3MoYnVmZmVyLCBwcm9wZXJ0eS5nZXRBbHRlcm5hdGVDbGFzcygpKTsKLSAgICAKLSAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFByaW1pdGl2ZVR5cGUoU3RyaW5nIGNsYXNzTmFtZSl7ICAgICAgCi0gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmEubGFuZy4iKSkKLSAgICAgIHsKLSAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiamF2YS5sYW5nLiIsICIiKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGNsYXNzTmFtZS5lbmRzV2l0aCgiZWdlciIpKQotICAgICAgewotICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCJlZ2VyIiwgIiIpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpKSkKLSAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICB9ZWxzZQotICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgCi0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRCb3hlZENsYXNzKAotICAgIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICBpZiAoImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJCb29sZWFuIjsKLSAgICBlbHNlIGlmICgiYnl0ZSIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIkJ5dGUiOwotICAgIGVsc2UgaWYgKCJjaGFyIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiQ2hhcmFjdGVyIjsKLSAgICBlbHNlIGlmICgiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiRG91YmxlIjsKLSAgICBlbHNlIGlmICgiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJGbG9hdCI7Ci0gICAgZWxzZSBpZiAoImludCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIkludGVnZXIiOwotICAgIGVsc2UgaWYgKCJsb25nIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiTG9uZyI7Ci0gICAgZWxzZSBpZiAoInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiU2hvcnQiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBwcmltaXRpdmVEZWZhdWx0VmFsdWUoU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgICBpZiAoImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJmYWxzZSI7Ci0gICAgZWxzZSBpZiAoImJ5dGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICIwIjsKLSAgICBlbHNlIGlmICgiY2hhciIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIicnIjsKLSAgICBlbHNlIGlmICgiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiMC4wZCI7Ci0gICAgZWxzZSBpZiAoImZsb2F0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiMC4wZiI7Ci0gICAgZWxzZSBpZiAoImludCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIjAiOwotICAgIGVsc2UgaWYgKCJsb25nIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiMEwiOwotICAgIGVsc2UgaWYgKCJzaG9ydCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIjAiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBmaWxsKAotICAgIFN0cmluZyBiYXNlLAotICAgIGludCAgICBsZW5ndGgpCi0gIHsKLSAgICBpZiAoYmFzZSA9PSBudWxsIHx8IGJhc2UubGVuZ3RoKCkgPiBsZW5ndGgpCi0gICAgICByZXR1cm4gYmFzZTsKLQotICAgIFN0cmluZ0J1ZmZlciBmaWxsZWQgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2UpOwotICAgIGZvciAoaW50IGk9YmFzZS5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGZpbGxlZC5hcHBlbmQoJyAnKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGxlZC50b1N0cmluZygpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGVGcm9tQ2xhc3MoCi0gICAgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgY2xhc3NOYW1lLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgY2hhciBjaCA9IGNsYXNzTmFtZS5jaGFyQXQoaSk7Ci0gICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZShjbGFzc05hbWUuY2hhckF0KGkgLSAxKSkgKwotICAgICAgICAgICAgICAgICBjbGFzc05hbWUuc3Vic3RyaW5nKGkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNsYXNzIG5hbWUgXCIiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBkb2VzIG5vdCB1c2UgaW5pdGNhcHMiKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlRnJvbU5hbWUoCi0gICAgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBpZiAoUkVTRVJWRURfV09SRFMuY29udGFpbnMobmFtZSkpCi0gICAgICBuYW1lID0gbmFtZSArICJQYXJhbSI7Ci0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoIlN0cmluZyIsIHZhbHVlKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJTdHJpbmciLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiXCIiICsgdmFsdWUucmVwbGFjZUFsbCgiXCciLCAiXFwnIikgKyAiXCIiOwotICAgIH0KLSAgICBlbHNlIGlmICgiTnVtYmVyIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICAvLyBEb3VibGUgdnMuIEludGVnZXIuCi0gICAgICBpZih2YWx1ZS5pbmRleE9mKCIuIikgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiSW50ZWdlci52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJEb3VibGUudmFsdWVPZigiICsgdmFsdWUgKyAiKSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoUHJvcGVydHlCZWFuIHByb3BlcnR5KXsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5RnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgICBTdHJpbmcgZGVmID0gcHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgIGlmIChkZWYgPT0gbnVsbCB8fCBkZWYubGVuZ3RoKCkgPT0gMCl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcykpewotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfSBlbHNlIGlmICgiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHByb3BlcnR5RnVsbENsYXNzKSl7Ci0gICAgICAgICAgICBpZiAoZGVmLnN0YXJ0c1dpdGgoIlwiIikgJiYgZGVmLmVuZHNXaXRoKCJcIiIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlwiIitkZWYrIlwiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAvL0FueSBvdGhlciBjbGFzcywgc28gd2UgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICByZXR1cm4gZGVmOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgdm9pZCBfYnVpbGRQcm9wZXJ0eUNsYXNzKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgTWF0Y2hlciBtYXRjaGVyID0gX0dFTkVSSUNfVFlQRS5tYXRjaGVyKHR5cGUpOwotICAgIGlmKG1hdGNoZXIubWF0Y2hlcygpKQotICAgIHsKLSAgICAgIC8vIEdlbmVyaWMgdHlwZQotICAgICAgYnVmZmVyLmFwcGVuZChVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhtYXRjaGVyLmdyb3VwKDEpKSk7Ci0gICAgICBidWZmZXIuYXBwZW5kKCc8Jyk7Ci0gICAgICBTdHJpbmdbXSB0eXBlcyA9IG1hdGNoZXIuZ3JvdXAoMikuc3BsaXQoIiwiKTsKLSAgICAgIGludCBtYXggPSB0eXBlcy5sZW5ndGggLSAxOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBtYXg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgX2J1aWxkUHJvcGVydHlDbGFzcyhidWZmZXIsIHR5cGVzW2ldKTsKLSAgICAgICAgaWYoaSA8IG1heCkKLSAgICAgICAgewotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJ1ZmZlci5hcHBlbmQoJz4nKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIE5vbi1nZW5lcmljIHR5cGUKLSAgICAgIGJ1ZmZlci5hcHBlbmQoVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3ModHlwZSkpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIFNldCBfY3JlYXRlUHJpbWl0aXZlVHlwZXNTZXQoKQotICB7Ci0gICAgU2V0IHByaW1pdGl2ZXMgPSBuZXcgVHJlZVNldCgpOwotICAgIGZvciAoaW50IGk9MDsgaSA8IF9QUklNSVRJVkVfVFlQRVMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHR5cGUgPSBfUFJJTUlUSVZFX1RZUEVTW2ldOwotICAgICAgcHJpbWl0aXZlcy5hZGQodHlwZSk7Ci0gICAgICBwcmltaXRpdmVzLmFkZCh0eXBlICsgIltdIik7Ci0gICAgfQotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQocHJpbWl0aXZlcyk7Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBTZXQgX2NyZWF0ZVJlc2VydmVkV29yZHNTZXQoKQotICB7Ci0gICAgU2V0IHJlc2VydmVkID0gbmV3IFRyZWVTZXQoKTsKLSAgICBmb3IgKGludCBpPTA7IGkgPCBfUkVTRVJWRURfV09SRFMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGtleXdvcmQgPSBfUkVTRVJWRURfV09SRFNbaV07Ci0gICAgICByZXNlcnZlZC5hZGQoa2V5d29yZCk7Ci0gICAgfQotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQocmVzZXJ2ZWQpOwotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX1BSSU1JVElWRV9UWVBFUyA9IG5ldyBTdHJpbmdbXQotICB7Ly8gVE9ETzogU2hvdWxkbid0IGphdmEubGFuZy4qIGJlIHNwZWNpZmllZCBpbiB0aGF0IGxpc3QgYXMgd2VsbD8KLSAgICAiYm9vbGVhbiIsCi0gICAgImJ5dGUiLAotICAgICJjaGFyIiwKLSAgICAiZmxvYXQiLAotICAgICJkb3VibGUiLAotICAgICJpbnQiLAotICAgICJzaG9ydCIsCi0gICAgImxvbmciLAotICB9OwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIF9SRVNFUlZFRF9XT1JEUyA9IG5ldyBTdHJpbmdbXQotICB7Ci0gICAgImFic3RyYWN0IiwKLSAgICAiYXNzZXJ0IiwKLSAgICAiYm9vbGVhbiIsCi0gICAgImJyZWFrIiwKLSAgICAiYnl0ZSIsCi0gICAgImNhc2UiLAotICAgICJjYXRjaCIsCi0gICAgImNoYXIiLAotICAgICJjbGFzcyIsCi0gICAgImNvbnN0IiwKLSAgICAiY29udGludWUiLAotICAgICJkZWZhdWx0IiwKLSAgICAiZG8iLAotICAgICJkb3VibGUiLAotICAgICJlbHNlIiwKLSAgICAiZXh0ZW5kcyIsCi0gICAgImZpbmFsIiwKLSAgICAiZmluYWxseSIsCi0gICAgImZsb2F0IiwKLSAgICAiZm9yIiwKLSAgICAiZ290byIsCi0gICAgImlmIiwKLSAgICAiaW1wbGVtZW50cyIsCi0gICAgImltcG9ydCIsCi0gICAgImluc3RhbmNlb2YiLAotICAgICJpbnQiLAotICAgICJpbnRlcmZhY2UiLAotICAgICJsb25nIiwKLSAgICAibmF0aXZlIiwKLSAgICAibmV3IiwKLSAgICAicGFja2FnZSIsCi0gICAgInByaXZhdGUiLAotICAgICJwcm90ZWN0ZWQiLAotICAgICJwdWJsaWMiLAotICAgICJyZXR1cm4iLAotICAgICJzaG9ydCIsCi0gICAgInN0YXRpYyIsCi0gICAgInN1cGVyIiwKLSAgICAic3dpdGNoIiwKLSAgICAic3luY2hyb25pemVkIiwKLSAgICAidGhpcyIsCi0gICAgInRocm93IiwKLSAgICAidGhyb3dzIiwKLSAgICAidHJhbnNpZW50IiwKLSAgICAidHJ5IiwKLSAgICAidm9pZCIsCi0gICAgInZvbGF0aWxlIiwKLSAgICAid2hpbGUiLAotICB9OwotCi0gIHN0YXRpYyBwdWJsaWMgZmluYWwgU2V0IFJFU0VSVkVEX1dPUkRTID0gX2NyZWF0ZVJlc2VydmVkV29yZHNTZXQoKTsKLSAgc3RhdGljIHB1YmxpYyBmaW5hbCBTZXQgUFJJTUlUSVZFX1RZUEVTID0gX2NyZWF0ZVByaW1pdGl2ZVR5cGVzU2V0KCk7Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgUGF0dGVybiBfR0VORVJJQ19UWVBFID0gUGF0dGVybi5jb21waWxlKCIoW148XSspPCguKyk+Iik7Ci0KLSAgLy8gbm8gaW5zdGFuY2VzCi0gIHByaXZhdGUgVXRpbCgpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvVmFsaWRhdG9yRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9WYWxpZGF0b3JGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzMTRjYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9WYWxpZGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5WYWxpZGF0b3JCZWFuOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKQotICB7Ci0gICAgcmV0dXJuIGFjY2VwdCgoVmFsaWRhdG9yQmVhbilvYmopOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1hJbmNsdWRlRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9YSW5jbHVkZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTAxNDdkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1hJbmNsdWRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxGaWx0ZXJJbXBsOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgWEluY2x1ZGVGaWx0ZXIgZXh0ZW5kcyBYTUxGaWx0ZXJJbXBsCi17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhJTkNMVURFX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIjsKLQotICBwdWJsaWMgWEluY2x1ZGVGaWx0ZXIoCi0gICAgWE1MUmVhZGVyIHBhcmVudCwKLSAgICBVUkwgICAgICAgYmFzZSkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgYmFzZXMucHVzaChiYXNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcigKLSAgICBMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICBsb2NhdG9ycy5wdXNoKGxvY2F0b3IpOwotICAgIHN1cGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZygKLSAgICBTdHJpbmcgcHJlZml4LAotICAgIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmICghbmFtZXNwYWNlVVJJLmVxdWFscyhYSU5DTFVERV9OQU1FU1BBQ0UpKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZXMuZGVjbGFyZVByZWZpeChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICBzdXBlci5zdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKLSAgICBTdHJpbmcgICAgIG5hbWVzcGFjZVVSSSwKLSAgICBTdHJpbmcgICAgIGxvY2FsTmFtZSwKLSAgICBTdHJpbmcgICAgIHF1YWxpZmllZE5hbWUsCi0gICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBuYW1lc3BhY2VzLnB1c2hDb250ZXh0KCk7Ci0gICAgLy8gc3VwcG9ydCBib3RoIERURCBhbmQgU2NoZW1hCi0gICAgaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoWElOQ0xVREVfTkFNRVNQQUNFKSAmJgotICAgICAgICBsb2NhbE5hbWUuZXF1YWxzKCJpbmNsdWRlIikpCi0gICAgewotICAgICAgLy8gaHJlZiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQKLSAgICAgIFN0cmluZyBocmVmID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaHJlZiIpOwotICAgICAgaWYgKGhyZWYgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiTWlzc2luZyBocmVmIGF0dHJpYnV0ZSIpOwotCi0gICAgICAvLyB4cG9pbnRlciBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwKLSAgICAgIFN0cmluZyB4cG9pbnRlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInhwb2ludGVyIik7Ci0KLSAgICAgIGRvWEluY2x1ZGUoaHJlZiwgeHBvaW50ZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxdWFsaWZpZWROYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KAotICAgIFN0cmluZyAgICAgbmFtZXNwYWNlVVJJLAotICAgIFN0cmluZyAgICAgbG9jYWxOYW1lLAotICAgIFN0cmluZyAgICAgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFuYW1lc3BhY2VVUkkuZXF1YWxzKFhJTkNMVURFX05BTUVTUEFDRSkpCi0gICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxdWFsaWZpZWROYW1lKTsKLQotICAgIG5hbWVzcGFjZXMucG9wQ29udGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmIChkZXB0aCA9PSAwKQotICAgICAgc3VwZXIuc3RhcnREb2N1bWVudCgpOwotCi0gICAgZGVwdGgrKzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgbG9jYXRvcnMucG9wKCk7Ci0gICAgZGVwdGgtLTsKLQotICAgIGlmIChkZXB0aCA9PSAwKQotICAgICAgc3VwZXIuZW5kRG9jdW1lbnQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBkb1hJbmNsdWRlKAotICAgIFN0cmluZyBocmVmLAotICAgIFN0cmluZyB4cG9pbnRlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHRhcmdldCA9IHJlc29sdmVVUkwoaHJlZik7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4RmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICBpZiAoeHBvaW50ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gcGFzcyBhbGwgcGFyc2VkIFNBWCBldmVudHMgdGhyb3VnaCBYUG9pbnRlckZpbHRlcgotICAgICAgICByZWFkZXIgPSBuZXcgWFBvaW50ZXJGaWx0ZXIocmVhZGVyLCBuYW1lc3BhY2VzLCB4cG9pbnRlcik7Ci0gICAgICB9Ci0gICAgICAvLyBwYXNzIGFsbCBzZWxlY3RlZCBYUG9pbnRlciBTQVggZXZlbnRzIHRvIFhJbmNsdWRlRmlsdGVyCi0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0gICAgICByZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIodGhpcyk7Ci0gICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOwotICAgICAgcmVhZGVyLnNldERUREhhbmRsZXIodGhpcyk7Ci0KLSAgICAgIC8vIHB1c2ggb24gbmV3IGJhc2UgVVJMIGluIGNhc2Ugb2YgbmVzdGVkIHhpOmluY2x1ZGUKLSAgICAgIGJhc2VzLnB1c2godGFyZ2V0KTsKLSAgICAgIHJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UodGFyZ2V0Lm9wZW5TdHJlYW0oKSkpOwotICAgICAgYmFzZXMucG9wKCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIHhpbmNsdWRlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudG9FeHRlcm5hbEZvcm0oKSwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkVycm9yIGR1cmluZyB4aW5jbHVkZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnRvRXh0ZXJuYWxGb3JtKCksIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgVVJMIHJlc29sdmVVUkwoCi0gICAgU3RyaW5nIGhyZWYpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFVSTCBiYXNlID0gKFVSTCkgYmFzZXMucGVlaygpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIG5ldyBVUkwoYmFzZSwgaHJlZik7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJFcnJvciByZXNvbHZpbmcgaHJlZiBcIiIgKyBocmVmICsgIlwiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgYmFzZSBcIiIgKyBiYXNlICsgIlwiIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgZGVwdGggPSAwOwotCi0gIHByaXZhdGUgU3RhY2sgYmFzZXMgPSBuZXcgU3RhY2soKTsKLSAgcHJpdmF0ZSBTdGFjayBsb2NhdG9ycyA9IG5ldyBTdGFjaygpOwotICBwcml2YXRlIE5hbWVzcGFjZVN1cHBvcnQgbmFtZXNwYWNlcyA9IG5ldyBOYW1lc3BhY2VTdXBwb3J0KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1hQb2ludGVyRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9YUG9pbnRlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWU3YWI0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1hQb2ludGVyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0OwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKLQotLyoqCi0gKiBGb3Igbm93LCBqdXN0IHNraXAgdGhlIHJvb3QgZWxlbWVudCBzaW5jZSB0aGF0J3Mgb3VyIHVzZWNhc2UuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYUG9pbnRlckZpbHRlciBleHRlbmRzIFhNTEZpbHRlckltcGwKLXsKLSAgcHVibGljIFhQb2ludGVyRmlsdGVyKAotICAgIFhNTFJlYWRlciAgICAgICAgcGFyZW50LAotICAgIE5hbWVzcGFjZVN1cHBvcnQgbmFtZXNwYWNlcywKLSAgICBTdHJpbmcgICAgICAgICAgIHhwb2ludGVyKQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLQotICAgIC8vIFdlIHN1cHBvcnQgYSB2ZXJ5IHJ1ZGltZW50YXJ5IC0gYnV0IHRvdGFsbHkgc3VmZmljaWVudCAtIFhQb2ludGVyIHN5bnRheCwKLSAgICAvLyB3aGljaCBpcyBqdXN0IC9lbGVtZW50L290aGVyZWxlbWVudC9vdGhlcm90aGVyZWxlbWVudC8qCi0gICAgaWYgKCF4cG9pbnRlci5zdGFydHNXaXRoKCIvIikgfHwgIXhwb2ludGVyLmVuZHNXaXRoKCIvKiIpKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgeHBvaW50ZXIgc3ludGF4OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvaW50ZXIpOwotCi0gICAgeHBvaW50ZXIgPSB4cG9pbnRlci5zdWJzdHJpbmcoMCwgeHBvaW50ZXIubGVuZ3RoKCkgLSAyKS5zdWJzdHJpbmcoMSk7Ci0gICAgU3RyaW5nW10gZWxlbWVudHMgPSB4cG9pbnRlci5zcGxpdCgiLyIpOwotICAgIGludCBjb3VudCA9IGVsZW1lbnRzLmxlbmd0aDsKLQotICAgIF9yb290TmFtZXNwYWNlVVJJID0gbmV3IFN0cmluZ1tjb3VudF07Ci0gICAgX3Jvb3RMb2NhbE5hbWUgPSBuZXcgU3RyaW5nW2NvdW50XTsKLSAgICBfYWNjZXB0Q2hpbGROb2RlcyA9IG5ldyBib29sZWFuW2NvdW50XTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBwYXJ0cyA9IGVsZW1lbnRzW2ldLnNwbGl0KCI6Iik7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gKHBhcnRzLmxlbmd0aCA9PSAxKSA/ICIiIDogcGFydHNbMF07Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlcy5nZXRVUkkocHJlZml4KTsKLSAgICAgIF9yb290TmFtZXNwYWNlVVJJW2ldID0gKG5hbWVzcGFjZVVSSSAhPSBudWxsKSA/IG5hbWVzcGFjZVVSSSA6ICIiOwotICAgICAgX3Jvb3RMb2NhbE5hbWVbaV0gPSAocGFydHMubGVuZ3RoID09IDEpID8gcGFydHNbMF0gOiBwYXJ0c1sxXTsKLSAgICAgIF9hY2NlcHRDaGlsZE5vZGVzW2ldID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgIFN0cmluZyAgICAgbmFtZXNwYWNlVVJJLAotICAgIFN0cmluZyAgICAgbG9jYWxOYW1lLAotICAgIFN0cmluZyAgICAgcXVhbGlmaWVkTmFtZSwKLSAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmIChfZGVwdGggPCBfYWNjZXB0Q2hpbGROb2Rlcy5sZW5ndGgpCi0gICAgewotICAgICAgX2FjY2VwdENoaWxkTm9kZXNbX2RlcHRoXSA9Ci0gICAgICAgICAgIChfcm9vdE5hbWVzcGFjZVVSSVtfZGVwdGhdLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICBfcm9vdExvY2FsTmFtZVtfZGVwdGhdLmVxdWFscyhsb2NhbE5hbWUpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoX2FjY2VwdGluZ0NoaWxkTm9kZXMoKSkKLSAgICB7Ci0gICAgICBzdXBlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHF1YWxpZmllZE5hbWUsIGF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIF9kZXB0aCsrOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIF9kZXB0aC0tOwotCi0gICAgaWYgKF9kZXB0aCA+PSBfYWNjZXB0Q2hpbGROb2Rlcy5sZW5ndGggJiYgX2FjY2VwdGluZ0NoaWxkTm9kZXMoKSkKLSAgICAgIHN1cGVyLmVuZEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHF1YWxpZmllZE5hbWUpOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBfYWNjZXB0aW5nQ2hpbGROb2RlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gX2FjY2VwdENoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaWYgKCFfYWNjZXB0Q2hpbGROb2Rlc1tpXSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgICAgIF9kZXB0aDsKLSAgcHJpdmF0ZSBib29sZWFuW10gX2FjY2VwdENoaWxkTm9kZXM7Ci0gIHByaXZhdGUgU3RyaW5nW10gIF9yb290TmFtZXNwYWNlVVJJOwotICBwcml2YXRlIFN0cmluZ1tdICBfcm9vdExvY2FsTmFtZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zY2hlbWFzL21hdmVuLWZhY2VzLXBsdWdpbi54c2QgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2NoZW1hcy9tYXZlbi1mYWNlcy1wbHVnaW4ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNlYmY0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zY2hlbWFzL21hdmVuLWZhY2VzLXBsdWdpbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICIxLjAiIGVuY29kaW5nID0gIlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0JICAgCi0tLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJElkOiAkCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiIHR5cGU9Im1mcDpjb21wb25lbnRUeXBlIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ibWZwOnByb3BlcnR5VHlwZSIgLz4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFsaWFzLW9mIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0ZS1ob2xkZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlcy1saXRlcmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2aXJ0dWFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJtZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb21wb25lbnRUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci10eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtc3VwZXJ0eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtc3VwZXJjbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1yZW5kZXJlci10eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1pbmctY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtdGFnLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibWZwOmNvbXBvbmVudC1ldmVudFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcG9uZW50LWV2ZW50VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1zb3VyY2UtaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1kZWxpdmVyeS1waGFzZXMiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViYTc2ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0JICAgCi0tLT4KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iIC8+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvdHJhbnNmb3JtLnhzbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy90cmFuc2Zvcm0ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM3MGFjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy90cmFuc2Zvcm0ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iDQotICAgICAgICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiANCi0gICAgICAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgDQotICAgICAgICAgICAgICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4c2wgeHMgamF2YWVlIG1mcCINCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIiA+DQotDQotICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiLz4NCi0gIDx4c2w6cGFyYW0gbmFtZT0icGFja2FnZUNvbnRhaW5zIiAvPg0KLSAgPHhzbDpwYXJhbSBuYW1lPSJ0eXBlUHJlZml4IiAvPg0KLSAgPHhzbDpwYXJhbSBuYW1lPSJyZW1vdmVSZW5kZXJlcnMiIC8+DQotDQotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRvY3R5cGUiID48IVtDREFUQVsNCi0gIDwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMS8vRU4iDQotICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiWw0KLSAgPCFFTEVNRU5UIGNvbXBvbmVudC1tZXRhZGF0YSBBTlk+DQotICA8IUVMRU1FTlQgYXR0cmlidXRlLW1ldGFkYXRhIEFOWT4NCi0gIDwhRUxFTUVOVCBwcm9wZXJ0eS1tZXRhZGF0YSBBTlk+DQotICA8IUVMRU1FTlQgZmFjZXQtbWV0YWRhdGEgQU5ZPg0KLSAgPCFFTEVNRU5UIHJlbmRlcmVyLW1ldGFkYXRhIEFOWT4NCi0gIDwhRUxFTUVOVCBhY2NlcHRzLWNoaWxkLWNvbXBvbmVudHMgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGF0dHJpYnV0ZS12YWx1ZXMgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGJhc2UtY29tcG9uZW50LXR5cGUgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGRlcHJlY2F0ZWQgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGRpc3BsYXktb3JkZXIgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGV4cGVydCAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgZmF2b3JpdGUtcHJvcGVydHkgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGdyb3VwICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBoZWxwLXRvcGljICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBoaWRkZW4gKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGluaXRpYWwtdmFsdWUgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIHByZWZlcnJlZCAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgcHJlZmVycmVkLWNoaWxkcmVuICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBhbGxvd2FibGUtY2hpbGRyZW4gKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIHByZWZlcnJlZC1jb21wb25lbnQtdHlwZXMgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIHByb3BlcnR5LWVkaXRvciAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgc2hvcnQtZGVzY3JpcHRpb24gKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIHRyYW5zbGF0YWJsZSAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgdW5zdXBwb3J0ZWQtYWdlbnRzICgjUENEQVRBKT4NCi0gIDwhQVRUTElTVCBjb21wb25lbnQtbWV0YWRhdGEgY29tcG9uZW50LXR5cGUgQ0RBVEEgI0lNUExJRUQ+DQotXT4NCi1dXT48L3hzbDp2YXJpYWJsZT4NCi0NCi0gIDx4c2w6a2V5IG5hbWU9ImNvbXBvbmVudC10eXBlIiANCi0gICAgICAgICAgIG1hdGNoPSJqYXZhZWU6Y29tcG9uZW50IiANCi0gICAgICAgICAgIHVzZT0iamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4NCi0NCi0gIDx4c2w6a2V5IG5hbWU9InJlbmRlci1raXQtaWQiIA0KLSAgICAgICAgICAgbWF0Y2g9ImphdmFlZTpyZW5kZXIta2l0IiANCi0gICAgICAgICAgIHVzZT0iamF2YWVlOnJlbmRlci1raXQtaWQvdGV4dCgpIiAvPg0KLQ0KLSAgPCEtLSBzd2l0Y2ggb2ZmIGRlZmF1bHQgdGV4dCBwcm9jZXNzaW5nIC0tPiAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL3RleHQoKSIgLz4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9qYXZhZWU6ZmFjZXMtY29uZmlnIiA+DQotICAgIDx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZG9jdHlwZSIgLz4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbmZpZyINCi0gICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvQ29uZmlndXJhdGlvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmFwcGxpY2F0aW9uIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmZhY3RvcnkiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50W25vdChjb250YWlucyhqYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LWNsYXNzLW1vZGlmaWVyL3RleHQoKSwgJ2Fic3RyYWN0JykpIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHMtd2l0aChqYXZhZWU6Y29tcG9uZW50LXR5cGUsICR0eXBlUHJlZml4KV0iIC8+DQotICAgICAgPCEtLSBJbiB0b21haGF3ayAxLjEgc29tZSBjb252ZXJ0ZXJzIHNob3VsZCBiZSBhZGRlZA0KLSAgICAgIG9uIGZhY2VzLWNvbmZpZy54bWwgbGlrZSBqYXZheC5tYXRoLkJpZ0RlY2ltYWwsIGlmIHdlDQotICAgICAgaW5jbHVkZSBqYXZhZWU6Y29udmVydGVyW2NvbnRhaW5zKGphdmFlZTpjb252ZXJ0ZXItY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXSANCi0gICAgICB0aGlzIGNsYXNzIHJlZmVyZW5jZXMgYXJlIG5vdCBhZGRlZCB0byBmYWNlcy1jb25maWcueG1sLiANCi0gICAgICBTbyB3ZSBuZWVkIHRvIGFkZCB0aGlzIGZvciBhdm9pZCBjaGVjayBwYWNrYWFnZUNvbnRhaW5zIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXIiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bWFuYWdlZC1iZWFuW2NvbnRhaW5zKGphdmFlZTptYW5hZ2VkLWJlYW4tY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpuYXZpZ2F0aW9uLXJ1bGUiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVmZXJlbmNlZC1iZWFuIiAvPg0KLSAgICAgIDwhLS0gbWVyZ2UgdGhlIHJlbmRlci1raXRzIHRvZ2V0aGVyIC0tPg0KLSAgICAgIDwhLS0gSW4gdG9tYWhhd2sgMS4xIHdlIGRvbid0IG1lcmdlIHJlbmRlci1raXQsDQotICAgICAgYmVjYXVzZSB3ZSBhZGQgYWxsIGNvbXBvbmVudHMgdG8gSFRNTF9CQVNJQyByZW5kZXJraXQsDQotICAgICAgYW5kIHRoZSByZW5kZXIta2l0LWNsYXNzIGlzIG1pc3NpbmcgKG15ZmFjZXMgY29yZSBvciBqc2YgcmkNCi0gICAgICBkZWNpZGUgd2hhdCBjbGFzcyBpbXBsZW1lbnQgdGhpcykuIA0KLSAgICAgIFNvLCBoZXJlIHdlIGNhbm5vdCBwdXQgDQotICAgICAgamF2YWVlOnJlbmRlci1raXRbY29udGFpbnMoamF2YWVlOnJlbmRlci1raXQtY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXQ0KLSAgICAgIGFnYWluDQotICAgICAgIC0tPiAgICAgIA0KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdCIgPg0KLSAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQiID4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iIC8+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIgLz4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6aWNvbiIgLz4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdC1pZCIgLz4NCi0gICAgICAgICAgPCEtLSBOb3QgcmVxdWlyZWQgaW4gdG9tYWhhd2sgMS4xIC0tPiANCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdC1jbGFzcyIgLz4NCi0gICAgICAgICAgIA0KLSAgICAgICAgICA8IS0tIERyb3AgcmVuZGVyZXJzIGlmIGRlc2lyZWQgLS0+DQotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHJlbW92ZVJlbmRlcmVycyAhPSAndHJ1ZSciPg0KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJrZXkoJ3JlbmRlci1raXQtaWQnLCBqYXZhZWU6cmVuZGVyLWtpdC1pZC90ZXh0KCkpIiA+DQotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlcltjb250YWlucyhqYXZhZWU6cmVuZGVyZXItY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmxpZmVjeWNsZVtjb250YWlucyhqYXZhZWU6cGhhc2UtbGlzdGVuZXIsICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YWxpZGF0b3JbY29udGFpbnMoamF2YWVlOnZhbGlkYXRvci1jbGFzcywgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGFwcGxpZXMgamF2YWVlOnByb3BlcnR5IHRlbXBsYXRlcw0KLSAgICAgICBmb3IgYSBjb21wb25lbnQgYW5kIGFsbCBzdXBlcnR5cGVzIC0tPg0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhcHBseS1wcm9wZXJ0eS10ZW1wbGF0ZXMiID4NCi0gICAgPHhzbDpwYXJhbSBuYW1lPSJjb21wb25lbnQiIC8+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIg0KLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+DQotICAgIDx4c2w6aWYgdGVzdD0iJGNvbXBvbmVudFN1cGVydHlwZSIgPg0KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1wcm9wZXJ0eS10ZW1wbGF0ZXMiID4NCi0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpIiAvPg0KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQotICAgIDwveHNsOmlmPg0KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOnByb3BlcnR5IiAvPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgYXBwbGllcyBqYXZhZWU6YXR0cmlidXRlIHRlbXBsYXRlcw0KLSAgICAgICBmb3IgYSBjb21wb25lbnQgYW5kIGFsbCBzdXBlcnR5cGVzIC0tPg0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhcHBseS1hdHRyaWJ1dGUtdGVtcGxhdGVzIiA+DQotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29tcG9uZW50IiAvPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSINCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPg0KLSAgICA8eHNsOmlmIHRlc3Q9IiRjb21wb25lbnRTdXBlcnR5cGUiID4NCi0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktYXR0cmlidXRlLXRlbXBsYXRlcyIgPg0KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCINCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKSIgLz4NCi0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICA8L3hzbDppZj4NCi0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTphdHRyaWJ1dGUiIC8+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBhcHBsaWVzIGphdmFlZTpmYWNldCB0ZW1wbGF0ZXMNCi0gICAgICAgZm9yIGEgY29tcG9uZW50IGFuZCBhbGwgc3VwZXJ0eXBlcyAtLT4NCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iYXBwbHktZmFjZXQtdGVtcGxhdGVzIiA+DQotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29tcG9uZW50IiAvPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSINCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPg0KLSAgICA8eHNsOmlmIHRlc3Q9IiRjb21wb25lbnRTdXBlcnR5cGUiID4NCi0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktZmFjZXQtdGVtcGxhdGVzIiA+DQotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpIiAvPg0KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQotICAgIDwveHNsOmlmPg0KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmZhY2V0IiAvPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudFtqYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZV0iIA0KLSAgICAgICAgICAgICAgICBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmljb24iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LXR5cGUiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LWNsYXNzIiAvPg0KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1mYWNldC10ZW1wbGF0ZXMiID4NCi0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIHNlbGVjdD0iLiIgLz4NCi0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1hdHRyaWJ1dGUtdGVtcGxhdGVzIiA+DQotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiBzZWxlY3Q9Ii4iIC8+DQotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCi0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktcHJvcGVydHktdGVtcGxhdGVzIiA+DQotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiBzZWxlY3Q9Ii4iIC8+DQotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphcHBsaWNhdGlvbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphY3Rpb24tbGlzdGVuZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVmYXVsdC1yZW5kZXIta2l0LWlkIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm1lc3NhZ2UtYnVuZGxlW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZpZXctaGFuZGxlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpzdGF0ZS1tYW5hZ2VyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm5hdmlnYXRpb24taGFuZGxlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eS1yZXNvbHZlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YXJpYWJsZS1yZXNvbHZlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpsb2NhbGUtY29uZmlnIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphY3Rpb24tbGlzdGVuZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFjdGlvbi1saXN0ZW5lciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1yZW5kZXIta2l0LWlkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWVzc2FnZS1idW5kbGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtYnVuZGxlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bmF2aWdhdGlvbi1oYW5kbGVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLWhhbmRsZXIiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2aWV3LWhhbmRsZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InZpZXctaGFuZGxlciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnN0YXRlLW1hbmFnZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InN0YXRlLW1hbmFnZXIiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1yZXNvbHZlciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktcmVzb2x2ZXIiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YXJpYWJsZS1yZXNvbHZlciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtcmVzb2x2ZXIiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsb2NhbGUtY29uZmlnIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsb2NhbGUtY29uZmlnIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjdG9yeSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjdG9yeSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmFwcGxpY2F0aW9uLWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZmFjZXMtY29udGV4dC1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmxpZmVjeWNsZS1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXQtZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXBwbGljYXRpb24tZmFjdG9yeSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZmFjdG9yeSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2VzLWNvbnRleHQtZmFjdG9yeSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29udGV4dC1mYWN0b3J5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGlmZWN5Y2xlLWZhY3RvcnkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1mYWN0b3J5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdC1mYWN0b3J5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWZhY3RvcnkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC10eXBlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtdHlwZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTpmYWNldFsxXSIgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBmYWNldHM8L3hzbDpjb21tZW50Pg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2V0IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldCIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXQtbmFtZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQtbmFtZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2V0LWV4dGVuc2lvblttZnA6ZmFjZXQtbWV0YWRhdGF8bWZwOmFsbG93YWJsZS1jaGlsZHJlbnxtZnA6cHJlZmVycmVkLWNoaWxkcmVufG1mcDpwcmVmZXJyZWR8bWZwOnVuc3VwcG9ydGVkLWFnZW50c3xtZnA6ZGVwcmVjYXRlZF0iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0LWV4dGVuc2lvbiIgPg0KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldC1tZXRhZGF0YSIgPg0KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTphdHRyaWJ1dGVbMV0iIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gYXR0cmlidXRlczwveHNsOmNvbW1lbnQ+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6YXR0cmlidXRlWzFdIiBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IGF0dHJpYnV0ZXM8L3hzbDpjb21tZW50Pg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlLW5hbWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUtZXh0ZW5zaW9uIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXh0ZW5zaW9uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTpwcm9wZXJ0eVsxXSIgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBwcm9wZXJ0aWVzPC94c2w6Y29tbWVudD4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eVtqYXZhZWU6cHJvcGVydHktbmFtZS90ZXh0KCkgPSAnYmluZGluZyddIiBwcmlvcml0eT0nMicgPg0KLSAgICA8IS0tIHNraXAgb3ZlciBwcm9wZXJ0aWVzIG5hbWVkICdiaW5kaW5nJyAtLT4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1uYW1lIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1uYW1lIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWNsYXNzIiA+DQotICAgICAgPCEtLSBlbGltaW5hdGUgZ2VuZXJpY3MgZm9yIDEuNC1iYXNlZCBjbGFzc2VzIGluIEpTRiAxLjEgLS0+DQotICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnModGV4dCgpLCAnJmx0OycpIiA+DQotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKHRleHQoKSwgJyZsdDsnKSIgLz4NCi0gICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICA8L3hzbDpjaG9vc2U+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uW21mcDpwcm9wZXJ0eS12YWx1ZXN8bWZwOmdyb3VwfG1mcDp0cmFuc2xhdGFibGV8bWZwOnByb3BlcnR5LWVkaXRvcnxtZnA6ZXhwZXJ0fG1mcDp1bnN1cHBvcnRlZC1hZ2VudHN8KltuYW1lc3BhY2UtdXJpKCkgIT0gJ2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZScgYW5kIG5hbWVzcGFjZS11cmkoKSAhPSdodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiddXSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktZXh0ZW5zaW9uIiA+DQotICAgICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LW1ldGFkYXRhIiA+DQotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb25bbWZwOnByb3BlcnR5LW1ldGFkYXRhXSIgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWV4dGVuc2lvbiIgPg0KLSAgICAgIDwhLS0gZG8gbm90IGNvcHkgdGhlIHByb3BlcnR5IHZhbHVlcywgYnV0IGluc3RlYWQgbGV0IHRoZW0gYmUgcGlja2VkIHVwIGluIHRoZSBwcm9wZXJ0eS1tZXRhZGF0YSBlbGVtZW50IC0tPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKltuYW1lKCkgIT0gJ21mcDpwcm9wZXJ0eS12YWx1ZXMnXSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1tZXRhZGF0YSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbWV0YWRhdGEiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgPCEtLSBwaWNrIHVwIGFueSBwcm9wZXJ0eS12YWx1ZXMgZWxlbWVudHMgZnJvbSB0aGUgcGFyZW50IG5vZGUgLS0+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLi9tZnA6cHJvcGVydHktdmFsdWVzIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGdyYWJzIHRoZSBjb21wb25lbnQtZmFtaWx5IGZyb20gYW4gYW5jZXN0b3IgLS0+DQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uW21mcDpjb21wb25lbnQtc3VwZXJ0eXBlXSIgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiDQotICAgICAgICAgICAgICAgICAgc2VsZWN0PSJtZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIiA+DQotICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiPg0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKS9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LWZhbWlseS90ZXh0KCkiIC8+DQotICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvblttZnA6Y29tcG9uZW50LWZhbWlseV0iIHByaW9yaXR5PSIyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uIiA+DQotICAgIDx4c2w6Y29tbWVudD5XYXJuaW5nOiB0aGlzIGNvbXBvbmVudCBoYXMgbm8gY29tcG9uZW50LWZhbWlseSE8L3hzbDpjb21tZW50Pg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6Y29tcG9uZW50LW1ldGFkYXRhIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtbWV0YWRhdGEiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiA+DQotICAgICAgPCEtLSB4c2w6YXBwbHktdGVtcGxhdGVzLyBUT0RPIHVzZSB0aGlzIGluc3RlYWQgLS0+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXItaWQiLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXItZm9yLWNsYXNzIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyLWNsYXNzIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cHJvcGVydHkiLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyLWlkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItaWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXItZm9yLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItZm9yLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbi1uYW1lIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tbmFtZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbi1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuLXNjb3BlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tc2NvcGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLXByb3BlcnR5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLXByb3BlcnR5IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bnVsbC12YWx1ZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbHVlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hcC1lbnRyaWVzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYXAtZW50cmllcyIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hcC1lbnRyeSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJ5IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6a2V5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJrZXkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTprZXktY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImtleS1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbHVlLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1lc3NhZ2UtYnVuZGxlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWJ1bmRsZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxpc3QtZW50cmllcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGlzdC1lbnRyaWVzIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bmF2aWdhdGlvbi1ydWxlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLXJ1bGUiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmcm9tLXZpZXctaWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZyb20tdmlldy1pZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm5hdmlnYXRpb24tY2FzZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1jYXNlIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZnJvbS1hY3Rpb24iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZyb20tYWN0aW9uIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZnJvbS1vdXRjb21lIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmcm9tLW91dGNvbWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp0by12aWV3LWlkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ0by12aWV3LWlkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVkaXJlY3QiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZGlyZWN0IiAvPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWZlcmVuY2VkLWJlYW4iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZmVyZW5jZWQtYmVhbi1uYW1lIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4tbmFtZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZmVyZW5jZWQtYmVhbi1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdCIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQtaWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtaWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0LWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLTwhLS0gVE9ETzogZmxhdHRlbiBjb21wb25lbnQgcHJvcGVydGllcyBpbnRvIHJlbmRlcmVyIGFzIGF0dHJpYnV0ZXMgLS0+DQotPCEtLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXJbamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXR5cGVdIg0KLSAgICAgICAgICAgICAgICBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXIiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtZmFtaWx5IiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLXR5cGUiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItY2xhc3MiIC8+DQotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRUeXBlIiBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci1leHRlbnNpb24vbWZwOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4NCi0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRUeXBlKS9qYXZhZWU6cHJvcGVydHkiID4NCi0gICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iIC8+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIgLz4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6aWNvbiIgLz4NCi0gICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiA+DQotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eS1uYW1lIiAvPg0KLSAgICAgICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzIiA+DQotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eS1jbGFzcyIgLz4NCi0gICAgICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVmYXVsdC12YWx1ZSIgLz4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6c3VnZ2VzdGVkLXZhbHVlIiAvPg0KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4dGVuc2lvbiIgPg0KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWZwOnByb3BlcnR5LWV4dGVuc2lvbi8qIiAvPg0KLSAgICAgICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphdHRyaWJ1dGUiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotLS0+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXIiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZmFtaWx5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXItdHlwZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvblttZnA6dW5zdXBwb3J0ZWQtYWdlbnRzXSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItZXh0ZW5zaW9uIiA+DQotICAgICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLW1ldGFkYXRhIiA+DQotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGlmZWN5Y2xlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwaGFzZS1saXN0ZW5lcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cGhhc2UtbGlzdGVuZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InBoYXNlLWxpc3RlbmVyIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVmYXVsdC1sb2NhbGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlZmF1bHQtbG9jYWxlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c3VwcG9ydGVkLWxvY2FsZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkLWxvY2FsZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbGlkYXRvciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIiA+DQotICAgICAgPCEtLSB4c2w6YXBwbHktdGVtcGxhdGVzLyBUT0RPIHVzZSB0aGlzIGluc3RlYWQgLS0+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFsaWRhdG9yLWlkIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFsaWRhdG9yLWNsYXNzIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cHJvcGVydHkiLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsaWRhdG9yLWlkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItaWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWxpZGF0b3ItY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlc2NyaXB0aW9uIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiIC8+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHlbamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi9tZnA6bG9uZy1kZXNjcmlwdGlvbl0vamF2YWVlOmRlc2NyaXB0aW9uIiBwcmlvcml0eT0iMSI+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi4vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi9tZnA6bG9uZy1kZXNjcmlwdGlvbi9AKiIgLz4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi9tZnA6bG9uZy1kZXNjcmlwdGlvbi90ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlc2NyaXB0aW9uL0B4bWw6bGFuZyIgPg0KLSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyIgPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAeG1sOmxhbmciIC8+PC94c2w6YXR0cmlidXRlPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkaXNwbGF5LW5hbWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmljb24iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Imljb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnNtYWxsLWljb24iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsYXJnZS1pY29uIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVmYXVsdC12YWx1ZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC12YWx1ZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnN1Z2dlc3RlZC12YWx1ZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic3VnZ2VzdGVkLXZhbHVlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6Y29tcG9uZW50LWZhbWlseSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmZhdm9yaXRlLXByb3BlcnR5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYXZvcml0ZS1wcm9wZXJ0eSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnJlbmRlcmVyLXR5cGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLXR5cGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS12YWx1ZXMiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS12YWx1ZXMiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDp1bnN1cHBvcnRlZC1hZ2VudHMiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InVuc3VwcG9ydGVkLWFnZW50cyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDwhLS0gSGFuZGxlIG1ldGFkYXRhIHdlIGRvIG5vdCBrbm93IGFib3V0IGJ5IGxldHRpbmcgaXQgdGhyb3VnaC4gIEN1cnJlbnRseSwNCi0gICBqdXN0IGZvciBwcm9wZXJ0eS1leHRlbnNpb24gYW5kIGNvbXBvbmVudC1tZXRhZGF0YSwgYnV0IHNob3VsZCBiZSBnbG9iYWwuDQotICAgU2VlIEpJUkEgaXNzdWVzIEFERkZBQ0VTLTM1OCwgQURGRkFDRVMtMzYxIGFuZCBBREZGQUNFUy00NzIgLS0+DQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJqYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uLypbbmFtZXNwYWNlLXVyaSgpICE9ICdodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUnIGFuZCBuYW1lc3BhY2UtdXJpKCkgIT0naHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4nXSI+DQotICAgIDx4c2w6Y29weT4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4NCi0gICAgPC94c2w6Y29weT4gDQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1mcDpjb21wb25lbnQtbWV0YWRhdGEvKltuYW1lc3BhY2UtdXJpKCkgIT0gJ2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZScgYW5kIG5hbWVzcGFjZS11cmkoKSAhPSdodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiddIj4NCi0gICAgPHhzbDpjb3B5Pg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPg0KLSAgICA8L3hzbDpjb3B5PiANCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6Y29tcG9uZW50LW1ldGFkYXRhL21mcDpncm91cCIgPg0KLTwhLS0gRGlzYWJsZSBjb21wb25lbnQgZ3JvdXBzIGZvciBub3cNCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Imdyb3VwIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0tLT4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktbWV0YWRhdGEvbWZwOmdyb3VwIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJncm91cCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LW1ldGFkYXRhL21mcDp0cmFuc2xhdGFibGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InRyYW5zbGF0YWJsZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6YWNjZXB0cy1jaGlsZC1jb21wb25lbnRzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhY2NlcHRzLWNoaWxkLWNvbXBvbmVudHMiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1lZGl0b3IiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWVkaXRvciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmV4cGVydCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZXhwZXJ0IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJlZmVycmVkLWNoaWxkcmVuIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcmVmZXJyZWQtY2hpbGRyZW4iID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDphbGxvd2FibGUtY2hpbGRyZW4iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFsbG93YWJsZS1jaGlsZHJlbiIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByZWZlcnJlZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJlZmVycmVkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6ZGVwcmVjYXRlZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVwcmVjYXRlZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmluaXRpYWwtdmFsdWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImluaXRpYWwtdmFsdWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotPC94c2w6c3R5bGVzaGVldD4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvdHJhbnNmb3JtMTIueHNsIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL3RyYW5zZm9ybTEyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5MTZlZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvdHJhbnNmb3JtMTIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIAotICAgICAgICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iIAotICAgICAgICAgICAgICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4c2wgeHMgamF2YWVlIG1mcCIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiID4KLQotICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlQ29udGFpbnMiIC8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29udmVydGVyUGFja2FnZUNvbnRhaW5zIiAvPgotICA8eHNsOnBhcmFtIG5hbWU9InZhbGlkYXRvclBhY2thZ2VDb250YWlucyIgLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJ0eXBlUHJlZml4IiAvPgotICA8eHNsOnBhcmFtIG5hbWU9InJlbW92ZVJlbmRlcmVycyIgLz4KLQotCi0KLSAgPHhzbDprZXkgbmFtZT0iY29tcG9uZW50LXR5cGUiIAotICAgICAgICAgICBtYXRjaD0iamF2YWVlOmNvbXBvbmVudCIgCi0gICAgICAgICAgIHVzZT0iamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4KLQotICA8eHNsOmtleSBuYW1lPSJyZW5kZXIta2l0LWlkIiAKLSAgICAgICAgICAgbWF0Y2g9ImphdmFlZTpyZW5kZXIta2l0IiAKLSAgICAgICAgICAgdXNlPSJqYXZhZWU6cmVuZGVyLWtpdC1pZC90ZXh0KCkiIC8+Ci0KLSAgPCEtLSBzd2l0Y2ggb2ZmIGRlZmF1bHQgdGV4dCBwcm9jZXNzaW5nIC0tPiAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vdGV4dCgpIiAvPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9qYXZhZWU6ZmFjZXMtY29uZmlnIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiID4KLSAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InhzaTpzY2hlbWFMb2NhdGlvbiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPjEuMjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmFwcGxpY2F0aW9uIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZmFjdG9yeSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudFtub3QoY29udGFpbnMoamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1jbGFzcy1tb2RpZmllci90ZXh0KCksICdhYnN0cmFjdCcpKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHMtd2l0aChqYXZhZWU6Y29tcG9uZW50LXR5cGUsICR0eXBlUHJlZml4KV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXJbY29udGFpbnMoamF2YWVlOmNvbnZlcnRlci1jbGFzcywgJGNvbnZlcnRlclBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bWFuYWdlZC1iZWFuW2NvbnRhaW5zKGphdmFlZTptYW5hZ2VkLWJlYW4tY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm5hdmlnYXRpb24tcnVsZSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlZmVyZW5jZWQtYmVhbiIgLz4KLSAgICAgIDwhLS0gbWVyZ2UgdGhlIHJlbmRlci1raXRzIHRvZ2V0aGVyIC0tPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0W2NvbnRhaW5zKGphdmFlZTpyZW5kZXIta2l0LWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0iID4KLSAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQiID4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIgLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiIC8+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6aWNvbiIgLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0LWlkIiAvPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXQtY2xhc3MiIC8+Ci0gICAgICAgICAgPCEtLSBEcm9wIHJlbmRlcmVycyBpZiBkZXNpcmVkIC0tPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHJlbW92ZVJlbmRlcmVycyAhPSAndHJ1ZSciPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImtleSgncmVuZGVyLWtpdC1pZCcsIGphdmFlZTpyZW5kZXIta2l0LWlkL3RleHQoKSkiID4KLSAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXJbY29udGFpbnMoamF2YWVlOnJlbmRlcmVyLWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bGlmZWN5Y2xlW2NvbnRhaW5zKGphdmFlZTpwaGFzZS1saXN0ZW5lciwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFsaWRhdG9yW2NvbnRhaW5zKGphdmFlZTp2YWxpZGF0b3ItY2xhc3MsICR2YWxpZGF0b3JQYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGFwcGxpZXMgamF2YWVlOnByb3BlcnR5IHRlbXBsYXRlcwotICAgICAgIGZvciBhIGNvbXBvbmVudCBhbmQgYWxsIHN1cGVydHlwZXMgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iYXBwbHktcHJvcGVydHktdGVtcGxhdGVzIiA+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJjb21wb25lbnQiIC8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPgotICAgIDx4c2w6aWYgdGVzdD0iJGNvbXBvbmVudFN1cGVydHlwZSIgPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LXByb3BlcnR5LXRlbXBsYXRlcyIgPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpIiAvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOnByb3BlcnR5IiAvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgYXBwbGllcyBqYXZhZWU6YXR0cmlidXRlIHRlbXBsYXRlcwotICAgICAgIGZvciBhIGNvbXBvbmVudCBhbmQgYWxsIHN1cGVydHlwZXMgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iYXBwbHktYXR0cmlidXRlLXRlbXBsYXRlcyIgPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29tcG9uZW50IiAvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4KLSAgICA8eHNsOmlmIHRlc3Q9IiRjb21wb25lbnRTdXBlcnR5cGUiID4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1hdHRyaWJ1dGUtdGVtcGxhdGVzIiA+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKSIgLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTphdHRyaWJ1dGUiIC8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBhcHBsaWVzIGphdmFlZTpmYWNldCB0ZW1wbGF0ZXMKLSAgICAgICBmb3IgYSBjb21wb25lbnQgYW5kIGFsbCBzdXBlcnR5cGVzIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LWZhY2V0LXRlbXBsYXRlcyIgPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29tcG9uZW50IiAvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4KLSAgICA8eHNsOmlmIHRlc3Q9IiRjb21wb25lbnRTdXBlcnR5cGUiID4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1mYWNldC10ZW1wbGF0ZXMiID4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpIiAvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmZhY2V0IiAvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudFtqYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZV0iIAotICAgICAgICAgICAgICAgIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTppY29uIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LXR5cGUiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtY2xhc3MiIC8+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktZmFjZXQtdGVtcGxhdGVzIiA+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIHNlbGVjdD0iLiIgLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktYXR0cmlidXRlLXRlbXBsYXRlcyIgPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LXByb3BlcnR5LXRlbXBsYXRlcyIgPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbiIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphcHBsaWNhdGlvbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YWN0aW9uLWxpc3RlbmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVmYXVsdC1yZW5kZXIta2l0LWlkIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bWVzc2FnZS1idW5kbGVbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2aWV3LWhhbmRsZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpzdGF0ZS1tYW5hZ2VyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bmF2aWdhdGlvbi1oYW5kbGVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZWwtcmVzb2x2ZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eS1yZXNvbHZlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhcmlhYmxlLXJlc29sdmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bG9jYWxlLWNvbmZpZyIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlc291cmNlLWJ1bmRsZSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphY3Rpb24tbGlzdGVuZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYWN0aW9uLWxpc3RlbmVyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXJlbmRlci1raXQtaWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWVzc2FnZS1idW5kbGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1idW5kbGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bmF2aWdhdGlvbi1oYW5kbGVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24taGFuZGxlciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2aWV3LWhhbmRsZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmlldy1oYW5kbGVyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnN0YXRlLW1hbmFnZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic3RhdGUtbWFuYWdlciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTplbC1yZXNvbHZlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJlbC1yZXNvbHZlciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1yZXNvbHZlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1yZXNvbHZlciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YXJpYWJsZS1yZXNvbHZlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1yZXNvbHZlciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsb2NhbGUtY29uZmlnIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxvY2FsZS1jb25maWciID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjdG9yeSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWN0b3J5IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphcHBsaWNhdGlvbi1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZmFjZXMtY29udGV4dC1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bGlmZWN5Y2xlLWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0LWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXBwbGljYXRpb24tZmFjdG9yeSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1mYWN0b3J5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2VzLWNvbnRleHQtZmFjdG9yeSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNlcy1jb250ZXh0LWZhY3RvcnkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGlmZWN5Y2xlLWZhY3RvcnkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWZhY3RvcnkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdC1mYWN0b3J5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtZmFjdG9yeSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC10eXBlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC10eXBlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTpmYWNldFsxXSIgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IGZhY2V0czwveHNsOmNvbW1lbnQ+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNldC1uYW1lIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0LW5hbWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXQtZXh0ZW5zaW9uW21mcDpmYWNldC1tZXRhZGF0YXxtZnA6YWxsb3dhYmxlLWNoaWxkcmVufG1mcDpwcmVmZXJyZWQtY2hpbGRyZW58bWZwOnByZWZlcnJlZHxtZnA6dW5zdXBwb3J0ZWQtYWdlbnRzfG1mcDpkZXByZWNhdGVkXSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldC1leHRlbnNpb24iID4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldC1tZXRhZGF0YSIgPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOmF0dHJpYnV0ZVsxXSIgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IGF0dHJpYnV0ZXM8L3hzbDpjb21tZW50PgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOmF0dHJpYnV0ZVsxXSIgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IGF0dHJpYnV0ZXM8L3hzbDpjb21tZW50PgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlLW5hbWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW5hbWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUtZXh0ZW5zaW9uIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHRlbnNpb24iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTpwcm9wZXJ0eVsxXSIgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IHByb3BlcnRpZXM8L3hzbDpjb21tZW50PgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5W2phdmFlZTpwcm9wZXJ0eS1uYW1lL3RleHQoKSA9ICdiaW5kaW5nJ10iIHByaW9yaXR5PScyJyA+Ci0gICAgPCEtLSBza2lwIG92ZXIgcHJvcGVydGllcyBuYW1lZCAnYmluZGluZycgLS0+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktbmFtZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1uYW1lIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWNsYXNzIiA+Ci0gICAgICA8IS0tIGVsaW1pbmF0ZSBnZW5lcmljcyBmb3IgMS40LWJhc2VkIGNsYXNzZXMgaW4gSlNGIDEuMSAtLT4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnModGV4dCgpLCAnJmx0OycpIiA+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUodGV4dCgpLCAnJmx0OycpIiAvPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb25bbWZwOnByb3BlcnR5LXZhbHVlc3xtZnA6Z3JvdXB8bWZwOnRyYW5zbGF0YWJsZXxtZnA6cHJvcGVydHktZWRpdG9yfG1mcDpleHBlcnR8bWZwOnVuc3VwcG9ydGVkLWFnZW50c3wqW25hbWVzcGFjZS11cmkoKSAhPSAnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlJyBhbmQgbmFtZXNwYWNlLXVyaSgpICE9J2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luJ11dIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWV4dGVuc2lvbiIgPgotICAgICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LW1ldGFkYXRhIiA+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb25bbWZwOnByb3BlcnR5LW1ldGFkYXRhXSIgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktZXh0ZW5zaW9uIiA+Ci0gICAgICA8IS0tIGRvIG5vdCBjb3B5IHRoZSBwcm9wZXJ0eSB2YWx1ZXMsIGJ1dCBpbnN0ZWFkIGxldCB0aGVtIGJlIHBpY2tlZCB1cCBpbiB0aGUgcHJvcGVydHktbWV0YWRhdGEgZWxlbWVudCAtLT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKltuYW1lKCkgIT0gJ21mcDpwcm9wZXJ0eS12YWx1ZXMnXSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LW1ldGFkYXRhIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LW1ldGFkYXRhIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8IS0tIHBpY2sgdXAgYW55IHByb3BlcnR5LXZhbHVlcyBlbGVtZW50cyBmcm9tIHRoZSBwYXJlbnQgbm9kZSAtLT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi4vbWZwOnByb3BlcnR5LXZhbHVlcyIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGdyYWJzIHRoZSBjb21wb25lbnQtZmFtaWx5IGZyb20gYW4gYW5jZXN0b3IgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb25bbWZwOmNvbXBvbmVudC1zdXBlcnR5cGVdIiBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSJtZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1leHRlbnNpb24iID4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5Ij4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKS9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LWZhbWlseS90ZXh0KCkiIC8+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvblttZnA6Y29tcG9uZW50LWZhbWlseV0iIHByaW9yaXR5PSIyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1leHRlbnNpb24iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uIiA+Ci0gICAgPHhzbDpjb21tZW50Pldhcm5pbmc6IHRoaXMgY29tcG9uZW50IGhhcyBubyBjb21wb25lbnQtZmFtaWx5ITwveHNsOmNvbW1lbnQ+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1leHRlbnNpb24iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpjb21wb25lbnQtbWV0YWRhdGEiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LW1ldGFkYXRhIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgPgotICAgICAgPCEtLSB4c2w6YXBwbHktdGVtcGxhdGVzLyBUT0RPIHVzZSB0aGlzIGluc3RlYWQgLS0+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXItaWQiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlci1mb3ItY2xhc3MiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlci1jbGFzcyIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cHJvcGVydHkiLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXItaWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWlkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlci1mb3ItY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWZvci1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXItY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuLW5hbWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLW5hbWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4tc2NvcGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLXNjb3BlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtcHJvcGVydHkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1wcm9wZXJ0eSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpudWxsLXZhbHVlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsdWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsdWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFwLWVudHJpZXMiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJpZXMiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFwLWVudHJ5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hcC1lbnRyeSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTprZXkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ia2V5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmtleS1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJrZXktY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsdWUtY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsdWUtY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWVzc2FnZS1idW5kbGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1idW5kbGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGlzdC1lbnRyaWVzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Imxpc3QtZW50cmllcyIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpuYXZpZ2F0aW9uLXJ1bGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1ydWxlIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZyb20tdmlldy1pZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmcm9tLXZpZXctaWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bmF2aWdhdGlvbi1jYXNlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tY2FzZSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmcm9tLWFjdGlvbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmcm9tLWFjdGlvbiIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmcm9tLW91dGNvbWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZnJvbS1vdXRjb21lIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnRvLXZpZXctaWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idG8tdmlldy1pZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWRpcmVjdCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWRpcmVjdCIgLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVmZXJlbmNlZC1iZWFuIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWZlcmVuY2VkLWJlYW4tbmFtZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4tbmFtZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWZlcmVuY2VkLWJlYW4tY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdCIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0LWlkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtaWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdC1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRPRE86IGZsYXR0ZW4gY29tcG9uZW50IHByb3BlcnRpZXMgaW50byByZW5kZXJlciBhcyBhdHRyaWJ1dGVzIC0tPgotPCEtLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlcltqYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtdHlwZV0iCi0gICAgICAgICAgICAgICAgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXIiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC1mYW1pbHkiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci10eXBlIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItY2xhc3MiIC8+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFR5cGUiIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50VHlwZSkvamF2YWVlOnByb3BlcnR5IiA+Ci0gICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIgLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiIC8+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6aWNvbiIgLz4KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW5hbWUiID4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJqYXZhZWU6cHJvcGVydHktbmFtZSIgLz4KLSAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3MiID4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJqYXZhZWU6cHJvcGVydHktY2xhc3MiIC8+Ci0gICAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZWZhdWx0LXZhbHVlIiAvPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnN1Z2dlc3RlZC12YWx1ZSIgLz4KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4dGVuc2lvbiIgPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZnA6cHJvcGVydHktZXh0ZW5zaW9uLyoiIC8+Ci0gICAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YXR0cmlidXRlIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotLS0+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXIiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWZhbWlseSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyLXR5cGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlci1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlci1leHRlbnNpb25bbWZwOnVuc3VwcG9ydGVkLWFnZW50c10iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItZXh0ZW5zaW9uIiA+Ci0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItbWV0YWRhdGEiID4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsaWZlY3ljbGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwaGFzZS1saXN0ZW5lcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwaGFzZS1saXN0ZW5lciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwaGFzZS1saXN0ZW5lciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZWZhdWx0LWxvY2FsZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LWxvY2FsZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzdXBwb3J0ZWQtbG9jYWxlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InN1cHBvcnRlZC1sb2NhbGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsaWRhdG9yIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIgPgotICAgICAgPCEtLSB4c2w6YXBwbHktdGVtcGxhdGVzLyBUT0RPIHVzZSB0aGlzIGluc3RlYWQgLS0+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhbGlkYXRvci1pZCIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFsaWRhdG9yLWNsYXNzIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eSIvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbGlkYXRvci1pZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItaWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsaWRhdG9yLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZXNjcmlwdGlvbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIgLz4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHlbamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi9tZnA6bG9uZy1kZXNjcmlwdGlvbl0vamF2YWVlOmRlc2NyaXB0aW9uIiBwcmlvcml0eT0iMSI+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4uL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vbWZwOmxvbmctZGVzY3JpcHRpb24vQCoiIC8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi9tZnA6bG9uZy1kZXNjcmlwdGlvbi90ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZXNjcmlwdGlvbi9AeG1sOmxhbmciID4KLSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyIgPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAeG1sOmxhbmciIC8+PC94c2w6YXR0cmlidXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkaXNwbGF5LW5hbWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmljb24iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iaWNvbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnNtYWxsLWljb24iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsYXJnZS1pY29uIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVmYXVsdC12YWx1ZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZhbHVlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnN1Z2dlc3RlZC12YWx1ZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzdWdnZXN0ZWQtdmFsdWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6Y29tcG9uZW50LWZhbWlseSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmZhdm9yaXRlLXByb3BlcnR5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhdm9yaXRlLXByb3BlcnR5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnJlbmRlcmVyLXR5cGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS12YWx1ZXMiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLXZhbHVlcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDp1bnN1cHBvcnRlZC1hZ2VudHMiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idW5zdXBwb3J0ZWQtYWdlbnRzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDwhLS0gSGFuZGxlIG1ldGFkYXRhIHdlIGRvIG5vdCBrbm93IGFib3V0IGJ5IGxldHRpbmcgaXQgdGhyb3VnaC4gIEN1cnJlbnRseSwKLSAgIGp1c3QgZm9yIHByb3BlcnR5LWV4dGVuc2lvbiBhbmQgY29tcG9uZW50LW1ldGFkYXRhLCBidXQgc2hvdWxkIGJlIGdsb2JhbC4KLSAgIFNlZSBKSVJBIGlzc3VlcyBBREZGQUNFUy0zNTgsIEFERkZBQ0VTLTM2MSBhbmQgQURGRkFDRVMtNDcyIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJqYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uLypbbmFtZXNwYWNlLXVyaSgpICE9ICdodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUnIGFuZCBuYW1lc3BhY2UtdXJpKCkgIT0naHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4nXSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICA8L3hzbDpjb3B5PiAKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWZwOmNvbXBvbmVudC1tZXRhZGF0YS8qW25hbWVzcGFjZS11cmkoKSAhPSAnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlJyBhbmQgbmFtZXNwYWNlLXVyaSgpICE9J2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luJ10iPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+Ci0gICAgPC94c2w6Y29weT4gCi0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmNvbXBvbmVudC1tZXRhZGF0YS9tZnA6Z3JvdXAiID4KLTwhLS0gRGlzYWJsZSBjb21wb25lbnQgZ3JvdXBzIGZvciBub3cKLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZ3JvdXAiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLS0tPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1tZXRhZGF0YS9tZnA6Z3JvdXAiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZ3JvdXAiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktbWV0YWRhdGEvbWZwOnRyYW5zbGF0YWJsZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ0cmFuc2xhdGFibGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmFjY2VwdHMtY2hpbGQtY29tcG9uZW50cyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhY2NlcHRzLWNoaWxkLWNvbXBvbmVudHMiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1lZGl0b3IiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktZWRpdG9yIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmV4cGVydCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJleHBlcnQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJlZmVycmVkLWNoaWxkcmVuIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByZWZlcnJlZC1jaGlsZHJlbiIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDphbGxvd2FibGUtY2hpbGRyZW4iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYWxsb3dhYmxlLWNoaWxkcmVuIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByZWZlcnJlZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcmVmZXJyZWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6ZGVwcmVjYXRlZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZXByZWNhdGVkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmluaXRpYWwtdmFsdWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC12YWx1ZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2NvbmYvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2NvbmYvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhMDQ1NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9jb25mL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotICA8YXBwbGljYXRpb24+DQotICAgIDx2aWV3LWhhbmRsZXI+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuYXBwbGljYXRpb24uVmlld0hhbmRsZXJJbXBsPC92aWV3LWhhbmRsZXI+DQotICAgIDxzdGF0ZS1tYW5hZ2VyPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmFwcGxpY2F0aW9uLlN0YXRlTWFuYWdlckltcGw8L3N0YXRlLW1hbmFnZXI+DQotICAgIDxuYXZpZ2F0aW9uLWhhbmRsZXI+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuYXBwbGljYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJJbXBsPC9uYXZpZ2F0aW9uLWhhbmRsZXI+DQotICAgIDx2YXJpYWJsZS1yZXNvbHZlcj5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5lbC5UcmluaWRhZFZhcmlhYmxlUmVzb2x2ZXI8L3ZhcmlhYmxlLXJlc29sdmVyPg0KLSAgPC9hcHBsaWNhdGlvbj4NCi0NCi0gIDxsaWZlY3ljbGU+DQotICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb250ZXh0LlRyaW5pZGFkUGhhc2VMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICA8L2xpZmVjeWNsZT4NCi0NCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuU2hvcnQ8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LlNob3J0Q29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gICAgIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5sYW5nLlNob3J0PC9jb252ZXJ0ZXItZm9yLWNsYXNzPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuU2hvcnRDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLkJ5dGU8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkJ5dGVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgICAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmxhbmcuQnl0ZTwvY29udmVydGVyLWZvci1jbGFzcz4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkJ5dGVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgDQotDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLkludGVnZXI8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkludGVnZXJDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgICAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvY29udmVydGVyLWZvci1jbGFzcz4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkludGVnZXJDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLkxvbmc8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkxvbmdDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgICAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmxhbmcuTG9uZzwvY29udmVydGVyLWZvci1jbGFzcz4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkxvbmdDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLkZsb2F0PC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5GbG9hdENvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICAgICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEubGFuZy5GbG9hdDwvY29udmVydGVyLWZvci1jbGFzcz4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkZsb2F0Q29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gIA0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLkRvdWJsZTwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRG91YmxlQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gICAgIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5sYW5nLkRvdWJsZTwvY29udmVydGVyLWZvci1jbGFzcz4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkRvdWJsZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICAgICAgICANCi0gIA0KLSAgPHZhbGlkYXRvcj4NCi0gICAgPHZhbGlkYXRvci1pZD5qYXZheC5mYWNlcy5Mb25nUmFuZ2U8L3ZhbGlkYXRvci1pZD4NCi0gICAgPHZhbGlkYXRvci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yPC92YWxpZGF0b3ItY2xhc3M+DQotICA8L3ZhbGlkYXRvcj4NCi0gIA0KLSAgPHZhbGlkYXRvcj4NCi0gICAgPGRpc3BsYXktbmFtZT52YWxpZGF0ZURhdGVUaW1lUmFuZ2U8L2Rpc3BsYXktbmFtZT4NCi0gICAgPHZhbGlkYXRvci1pZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRGF0ZVRpbWVSYW5nZTwvdmFsaWRhdG9yLWlkPg0KLSAgICA8dmFsaWRhdG9yLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuRGF0ZVRpbWVSYW5nZVZhbGlkYXRvcjwvdmFsaWRhdG9yLWNsYXNzPiAgIA0KLSAgPC92YWxpZGF0b3I+DQotDQotICA8dmFsaWRhdG9yPg0KLSAgICA8ZGlzcGxheS1uYW1lPnZhbGlkYXRlUmVndWxhckV4cHJlc3Npb248L2Rpc3BsYXktbmFtZT4NCi0gICAgPHZhbGlkYXRvci1pZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwPC92YWxpZGF0b3ItaWQ+DQotICAgIDx2YWxpZGF0b3ItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudmFsaWRhdG9yLlJlZ0V4cFZhbGlkYXRvcjwvdmFsaWRhdG9yLWNsYXNzPg0KLSAgPC92YWxpZGF0b3I+DQotDQotICA8dmFsaWRhdG9yPg0KLSAgICA8ZGlzcGxheS1uYW1lPnZhbGlkYXRlQnl0ZUxlbmd0aDwvZGlzcGxheS1uYW1lPg0KLSAgICA8dmFsaWRhdG9yLWlkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5CeXRlTGVuZ3RoPC92YWxpZGF0b3ItaWQ+DQotICAgIDx2YWxpZGF0b3ItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudmFsaWRhdG9yLkJ5dGVMZW5ndGhWYWxpZGF0b3I8L3ZhbGlkYXRvci1jbGFzcz4gICANCi0gIDwvdmFsaWRhdG9yPg0KLQ0KLSAgIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+Q29sb3IgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNvbG9yPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5Db2xvckNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkZXNjcmlwdGlvbj5Db2xvciBDb252ZXJ0ZXI8L2Rlc2NyaXB0aW9uPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmF3dC5Db2xvcjwvY29udmVydGVyLWZvci1jbGFzcz4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkNvbG9yQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0NCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+RGF0ZSBUaW1lIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLkRhdGVUaW1lPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPkRhdGUgVGltZSBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1pZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRGF0ZVRpbWU8L2NvbnZlcnRlci1pZD4gICAgDQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+RGF0ZSBUaW1lIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLnV0aWwuRGF0ZTwvY29udmVydGVyLWZvci1jbGFzcz4gICANCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5EYXRlIFRpbWUgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEuc3FsLlRpbWVzdGFtcDwvY29udmVydGVyLWZvci1jbGFzcz4gICANCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LlRpbWVzdGFtcENvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPkRhdGUgVGltZSBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5zcWwuRGF0ZTwvY29udmVydGVyLWZvci1jbGFzcz4gICANCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkphdmFTcWxEYXRlQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0NCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+TnVtYmVyIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmxhbmcuTnVtYmVyPC9jb252ZXJ0ZXItZm9yLWNsYXNzPiAgIA0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb252ZXJ0Lk51bWJlckNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPk51bWJlciBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5OdW1iZXI8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udmVydC5OdW1iZXJDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPk51bWJlciBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1pZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTnVtYmVyPC9jb252ZXJ0ZXItaWQ+IA0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb252ZXJ0Lk51bWJlckNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxyZWZlcmVuY2VkLWJlYW4+DQotICAgIDxkZXNjcmlwdGlvbj5pbXBsaWNpdCBvYmplY3QgcHJvdmlkZWQgYnkgVHJpbmlkYWQ8L2Rlc2NyaXB0aW9uPg0KLSAgICA8ZGlzcGxheS1uYW1lPlJlcXVlc3QgQ29udGV4dDwvZGlzcGxheS1uYW1lPg0KLSAgICA8cmVmZXJlbmNlZC1iZWFuLW5hbWU+cmVxdWVzdENvbnRleHQ8L3JlZmVyZW5jZWQtYmVhbi1uYW1lPg0KLSAgICA8cmVmZXJlbmNlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0PC9yZWZlcmVuY2VkLWJlYW4tY2xhc3M+DQotICA8L3JlZmVyZW5jZWQtYmVhbj4NCi0NCi0gIDxyZWZlcmVuY2VkLWJlYW4+DQotICAgIDxkZXNjcmlwdGlvbj5UcmluaWRhZCBQcm9jZXNzIFNjb3BlIE1hcDwvZGVzY3JpcHRpb24+DQotICAgIDxkaXNwbGF5LW5hbWU+UHJvY2VzcyBTY29wZTwvZGlzcGxheS1uYW1lPg0KLSAgICA8cmVmZXJlbmNlZC1iZWFuLW5hbWU+cHJvY2Vzc1Njb3BlPC9yZWZlcmVuY2VkLWJlYW4tbmFtZT4NCi0gICAgPHJlZmVyZW5jZWQtYmVhbi1jbGFzcz5qYXZhLnV0aWwuTWFwPC9yZWZlcmVuY2VkLWJlYW4tY2xhc3M+DQotICA8L3JlZmVyZW5jZWQtYmVhbj4NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhLXRlbXBsYXRlcy9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29tcG9uZW50L1VJWENvbW1hbmRUZW1wbGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS10ZW1wbGF0ZXMvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbXBvbmVudC9VSVhDb21tYW5kVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOWYwMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhLXRlbXBsYXRlcy9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29tcG9uZW50L1VJWENvbW1hbmRUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5BY3Rpb25Tb3VyY2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZzsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5BYm9ydFByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuRmFjZXNFdmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LkxhdW5jaEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5MYXVuY2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuUmV0dXJuRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LlJldHVybkxpc3RlbmVyOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGNvbW1hbmQgY29tcG9uZW50cy4KLSAqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbjogMS4zICQpICREYXRlOiAyMDA0LzA3LzE5IDE4OjI1OjE3ICQKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIFVJWENvbW1hbmRUZW1wbGF0ZSBleHRlbmRzIFVJWENvbXBvbmVudEJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEFjdGlvblNvdXJjZSwgRGlhbG9nU291cmNlCi17Ci0vKiovIC8vIEFic3RyYWN0IG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgY29kZSBnZW4KLS8qKi8gIGFic3RyYWN0IHB1YmxpYyBNZXRob2RCaW5kaW5nIGdldEFjdGlvbkxpc3RlbmVyKCk7Ci0vKiovICBhYnN0cmFjdCBwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRSZXR1cm5MaXN0ZW5lcigpOwotLyoqLyAgYWJzdHJhY3QgcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0TGF1bmNoTGlzdGVuZXIoKTsKLQotCi0gIC8qKgotICAgKiBBZGQgYSBMYXVuY2hMaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExhdW5jaExpc3RlbmVyKExhdW5jaExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgYWRkRmFjZXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGEgTGF1bmNoTGlzdGVuZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVMYXVuY2hMaXN0ZW5lcihMYXVuY2hMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIHJlbW92ZUZhY2VzTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIExhdW5jaCBhbGwgYWRkZWQgTGF1bmNoTGlzdGVuZXJzLgotICAgKi8KLSAgcHVibGljIExhdW5jaExpc3RlbmVyW10gZ2V0TGF1bmNoTGlzdGVuZXJzKCkKLSAgewotICAgIHJldHVybiAoTGF1bmNoTGlzdGVuZXJbXSkgZ2V0RmFjZXNMaXN0ZW5lcnMoTGF1bmNoTGlzdGVuZXIuY2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxwPkludGVyY2VwdCA8Y29kZT5xdWV1ZUV2ZW50PC9jb2RlPiBhbmQgbWFyayB0aGUgcGhhc2VJZCBmb3IgdGhlCi0gICAqIGV2ZW50IHRvIGJlIDxjb2RlPlBoYXNlSWQuQVBQTFlfUkVRVUVTVF9WQUxVRVM8L2NvZGU+IGlmIHRoZQotICAgKiA8Y29kZT5pbW1lZGlhdGU8L2NvZGU+IGZsYWcgaXMgdHJ1ZSwKLSAgICogPGNvZGU+UGhhc2VJZC5JTlZPS0VfQVBQTElDQVRJT048L2NvZGU+IG90aGVyd2lzZS48L3A+Ci0gICAqLwotICBwdWJsaWMgdm9pZCBxdWV1ZUV2ZW50KEZhY2VzRXZlbnQgZSkKLSAgewotICAgIGlmIChlIGluc3RhbmNlb2YgQWN0aW9uRXZlbnQpCi0gICAgewotICAgICAgaWYgKGlzSW1tZWRpYXRlKCkpCi0gICAgICB7Ci0gICAgICAgIGUuc2V0UGhhc2VJZChQaGFzZUlkLkFOWV9QSEFTRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGUuc2V0UGhhc2VJZChQaGFzZUlkLklOVk9LRV9BUFBMSUNBVElPTik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3VwZXIucXVldWVFdmVudChlKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgYnJvYWRjYXN0KEZhY2VzRXZlbnQgZXZlbnQpIHRocm93cyBBYm9ydFByb2Nlc3NpbmdFeGNlcHRpb24KLSAgewotICAgIC8vIFBlcmZvcm0gc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBBY3Rpb25FdmVudHM6ICB0ZWxsCi0gICAgLy8gdGhlIFJlcXVlc3RDb250ZXh0IHRvIHJlbWVtYmVyIHRoaXMgY29tbWFuZCBpbnN0YW5jZQotICAgIC8vIHNvIHRoYXQgdGhlIE5hdmlnYXRpb25IYW5kbGVyIGNhbiBsb2NhdGUgdXMgdG8gcXVldWUKLSAgICAvLyBhIExhdW5jaEV2ZW50LgotICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEFjdGlvbkV2ZW50KQotICAgIHsKLSAgICAgIFJlcXVlc3RDb250ZXh0IGFmQ29udGV4dCA9IFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOwotICAgICAgYWZDb250ZXh0LmdldERpYWxvZ1NlcnZpY2UoKS5zZXRDdXJyZW50TGF1bmNoU291cmNlKHRoaXMpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gUGVyZm9ybSBzdGFuZGFyZCBzdXBlcmNsYXNzIHByb2Nlc3NpbmcKLSAgICAgICAgc3VwZXIuYnJvYWRjYXN0KGV2ZW50KTsKLQotICAgICAgICAvLyBOb3RpZnkgdGhlIHNwZWNpZmllZCBhY3Rpb24gbGlzdGVuZXIgbWV0aG9kIChpZiBhbnkpLAotICAgICAgICAvLyBhbmQgdGhlIGRlZmF1bHQgYWN0aW9uIGxpc3RlbmVyCi0gICAgICAgIF9fYnJvYWRjYXN0KGV2ZW50LCBnZXRBY3Rpb25MaXN0ZW5lcigpKTsKLQotICAgICAgICBGYWNlc0NvbnRleHQgY29udGV4dCA9IGdldEZhY2VzQ29udGV4dCgpOwotICAgICAgICBBY3Rpb25MaXN0ZW5lciBkZWZhdWx0QWN0aW9uTGlzdGVuZXIgPQotICAgICAgICAgIGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRBY3Rpb25MaXN0ZW5lcigpOwotICAgICAgICBpZiAoZGVmYXVsdEFjdGlvbkxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkZWZhdWx0QWN0aW9uTGlzdGVuZXIucHJvY2Vzc0FjdGlvbigoQWN0aW9uRXZlbnQpIGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBhZkNvbnRleHQuZ2V0RGlhbG9nU2VydmljZSgpLnNldEN1cnJlbnRMYXVuY2hTb3VyY2UobnVsbCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBQZXJmb3JtIHN0YW5kYXJkIHN1cGVyY2xhc3MgcHJvY2Vzc2luZwotICAgICAgc3VwZXIuYnJvYWRjYXN0KGV2ZW50KTsKLQotICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTGF1bmNoRXZlbnQpCi0gICAgICB7Ci0gICAgICAgIF9fYnJvYWRjYXN0KGV2ZW50LCBnZXRMYXVuY2hMaXN0ZW5lcigpKTsKLSAgICAgICAgYm9vbGVhbiB1c2VXaW5kb3cgPQotICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoZ2V0QXR0cmlidXRlcygpLmdldCgidXNlV2luZG93IikpOwotCi0gICAgICAgICgoTGF1bmNoRXZlbnQpIGV2ZW50KS5sYXVuY2hEaWFsb2codXNlV2luZG93KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgUmV0dXJuRXZlbnQpCi0gICAgICB7Ci0gICAgICAgIF9fYnJvYWRjYXN0KGV2ZW50LCBnZXRSZXR1cm5MaXN0ZW5lcigpKTsKLSAgICAgICAgLy8gPS09QUVXOiBhbHdheXMganVtcCB0byByZW5kZXIgcmVzcG9uc2U/Pz8gIFNlZW1zIHRoZSBzYWZlc3QKLSAgICAgICAgLy8gb3B0aW9uLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gaW1tZWRpYXRlbHkgdXBkYXRlIGEgbW9kZWwKLSAgICAgICAgLy8gb3IgcmVhbGx5IHBlcmZvcm0gYW55IHZhbGlkYXRpb24uCi0gICAgICAgIGdldEZhY2VzQ29udGV4dCgpLnJlbmRlclJlc3BvbnNlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvQWJzdHJhY3RNb2pvVGVzdENhc2UuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9BYnN0cmFjdE1vam9UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY3NWFmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9BYnN0cmFjdE1vam9UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkJ1aWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi0vKioKLSAqIFRlc3RzIHRoZSBjb21wb25lbnQgZ2VuZXJhdGlvbiBtb2pvLgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RNb2pvVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBBYnN0cmFjdE1vam9UZXN0Q2FzZS4KLSAgICoKLSAgICogQHBhcmFtIHRlc3ROYW1lICB0aGUgdGVzdCB0byBleGVjdXRlCi0gICAqLwotICBwdWJsaWMgQWJzdHJhY3RNb2pvVGVzdENhc2UoCi0gICAgU3RyaW5nIHRlc3ROYW1lKQotICB7Ci0gICAgc3VwZXIodGVzdE5hbWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TW9qb1Byb2plY3QoCi0gICAgTW9qbyAgIG1vam8sCi0gICAgU3RyaW5nIG5hbWUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgIEJ1aWxkIGJ1aWxkID0gbmV3IEJ1aWxkKCk7Ci0gICAgYnVpbGQuc2V0T3V0cHV0RGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1idWlsZC1vdXRwdXQiKTsKLSAgICBtb2RlbC5zZXRCdWlsZChidWlsZCk7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sIG5hbWUsIG5ldyBNYXZlblByb2plY3QobW9kZWwpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldE1vam9GaWVsZCgKLSAgICBNb2pvICAgbW9qbywKLSAgICBTdHJpbmcgbmFtZSwKLSAgICBPYmplY3QgdmFsdWUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDbGFzcyBtb2pvQ2xhc3MgPSBtb2pvLmdldENsYXNzKCk7Ci0gICAgICBGaWVsZCBmaWVsZCA9IG1vam9DbGFzcy5nZXREZWNsYXJlZEZpZWxkKG5hbWUpOwotICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgIGZpZWxkLnNldChtb2pvLCB2YWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJVbmtub3duIE1vam8gcHJvcGVydHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArICJcIiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBzZXR0aW5nIE1vam8gcHJvcGVydHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArICJcIiIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldE1vam9Qcm9wZXJ0eSgKLSAgICBNb2pvICAgbW9qbywKLSAgICBTdHJpbmcgbmFtZSwKLSAgICBPYmplY3QgdmFsdWUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBzZXRNb2pvUHJvcGVydHkobW9qbywgbmFtZSwgdmFsdWUuZ2V0Q2xhc3MoKSwgdmFsdWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TW9qb1Byb3BlcnR5KAotICAgIE1vam8gICAgbW9qbywKLSAgICBTdHJpbmcgIG5hbWUsCi0gICAgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHNldE1vam9Qcm9wZXJ0eShtb2pvLCBuYW1lLCBCb29sZWFuLlRZUEUsIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TW9qb1Byb3BlcnR5KAotICAgIE1vam8gICBtb2pvLAotICAgIFN0cmluZyBuYW1lLAotICAgIENsYXNzICB0eXBlLAotICAgIE9iamVjdCB2YWx1ZSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIENsYXNzIG1vam9DbGFzcyA9IG1vam8uZ2V0Q2xhc3MoKTsKLSAgICAgIE1ldGhvZCBtZXRob2QgPSBtb2pvQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIudG9VcHBlckNhc2UobmFtZS5jaGFyQXQoMCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuc3Vic3RyaW5nKDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117dHlwZX0pOwotICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICBtZXRob2QuaW52b2tlKG1vam8sIG5ldyBPYmplY3RbXXt2YWx1ZX0pOwotICAgIH0KLSAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVua25vd24gTW9qbyBwcm9wZXJ0eSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIHNldHRpbmcgTW9qbyBwcm9wZXJ0eSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBzZXR0aW5nIE1vam8gcHJvcGVydHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArICJcIiIsIGUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlQ29tcG9uZW50c01vam9UZXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVDb21wb25lbnRzTW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyMjE2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVDb21wb25lbnRzTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLkdlbmVyYXRlQ29tcG9uZW50c01vam87Ci0KLS8qKgotICogVGVzdHMgdGhlIGNvbXBvbmVudCBnZW5lcmF0aW9uIG1vam8uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUNvbXBvbmVudHNNb2pvVGVzdCBleHRlbmRzIEFic3RyYWN0TW9qb1Rlc3RDYXNlCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IEdlbmVyYXRlQ29tcG9uZW50c01vam9UZXN0LgotICAgKgotICAgKiBAcGFyYW0gdGVzdE5hbWUgIHRoZSB0ZXN0IHRvIGV4ZWN1dGUKLSAgICovCi0gIHB1YmxpYyBHZW5lcmF0ZUNvbXBvbmVudHNNb2pvVGVzdCgKLSAgICBTdHJpbmcgdGVzdE5hbWUpCi0gIHsKLSAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBNb2pvIG1vam8gPSBuZXcgR2VuZXJhdGVDb21wb25lbnRzTW9qbygpOwotICAgIEZpbGUgZ2VuU3JjRGlyID0gbmV3IEZpbGUoInRhcmdldC9tb2pvLXRlc3Qtb3V0cHV0L2phdmEiKTsKLQotICAgIHNldE1vam9Qcm9qZWN0KG1vam8sICJwcm9qZWN0Iik7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJwYWNrYWdlQ29udGFpbnMiLCAib3JnIik7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJ0eXBlUHJlZml4IiwgIm9yZy5hcGFjaGUiKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgInRlbXBsYXRlU291cmNlRGlyZWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvdGVzdC9qYXZhLXRlbXBsYXRlcyIpKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgImdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSIsIGdlblNyY0Rpcik7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJmb3JjZSIsIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICBfbW9qbyA9IG1vam87Ci0gICAgX2dlblNyY0RpciA9IGdlblNyY0RpcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkKLSAgewotICAgIF9tb2pvID0gbnVsbDsKLSAgICBfZ2VuU3JjRGlyID0gbnVsbDsKLSAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdEZWZhdWx0SW5kZXgoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KLSAgewotICAgIF9tb2pvLmV4ZWN1dGUoKTsKLSAgfQotLyoKLSAgcHVibGljIHZvaWQgdGVzdFNraXBBUEkoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgc2V0TW9qb0ZpZWxkKF9tb2pvLCAicmVzb3VyY2VQYXRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdFNraXBBUEkubHN0Iik7Ci0gICAgX21vam8uZXhlY3V0ZSgpOwotCi0gICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoX2dlblNyY0RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXgvZmFjZXMvY29tcG9uZW50L1VJTmFtaW5nQ29udGFpbmVyLmphdmEiKTsKLSAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkKLSAgICAgIGZhaWwoIkphdmFTZXJ2ZXIgRmFjZXMgQVBJIGNvbXBvbmVudCBnZW5lcmF0ZWQiKTsKLSAgfQotKi8KLSAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uCi0gIHsKLSAgICBzZXRNb2pvRmllbGQoX21vam8sICJyZXNvdXJjZVBhdGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0R2VuZXJhdGUubHN0Iik7Ci0gICAgX21vam8uZXhlY3V0ZSgpOwotCi0gICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoX2dlblNyY0RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbXBvbmVudC9VSVhDb21tYW5kLmphdmEiKTsKLSAgICBpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICBmYWlsKCJDb21wb25lbnQgbm90IGdlbmVyYXRlZCIpOwotCi0gICAgLy8gVE9ETzogdmVyaWZ5IGlkZW50aXR5IGNvbnRlbnQgd2l0aCB0cmluaWRhZCBGYWNlcyBleGFtcGxlCi0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVXaXRoVGVtcGxhdGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KLSAgewotICAgIHNldE1vam9GaWVsZChfbW9qbywgInJlc291cmNlUGF0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RHZW5lcmF0ZS5sc3QiKTsKLSAgICBfbW9qby5leGVjdXRlKCk7Ci0KLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShfZ2VuU3JjRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29tcG9uZW50L1VJWENvbW1hbmQuamF2YSIpOwotICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkKLSAgICAgIGZhaWwoIkNvbXBvbmVudCBub3QgZ2VuZXJhdGVkIik7Ci0KLSAgICAvLyBUT0RPOiB2ZXJpZnkgaWRlbnRpdHkgY29udGVudCB3aXRoIHRyaW5pZGFkIEZhY2VzIGV4YW1wbGUKLSAgfQotCi0gIHByaXZhdGUgTW9qbyBfbW9qbzsKLSAgcHJpdmF0ZSBGaWxlIF9nZW5TcmNEaXI7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlc0NvbmZpZ01vam9UZXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlc0NvbmZpZ01vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWE1MjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZXNDb25maWdNb2pvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuR2VuZXJhdGVGYWNlc0NvbmZpZ01vam87Ci0KLS8qKgotICogVGVzdHMgdGhlIGZhY2VzLWNvbmZpZy54bWwgZ2VuZXJhdGlvbiBtb2pvLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVGYWNlc0NvbmZpZ01vam9UZXN0IGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgR2VuZXJhdGVGYWNlc0NvbmZpZ01vam9UZXN0LgotICAgKgotICAgKiBAcGFyYW0gdGVzdE5hbWUgIHRoZSB0ZXN0IHRvIGV4ZWN1dGUKLSAgICovCi0gIHB1YmxpYyBHZW5lcmF0ZUZhY2VzQ29uZmlnTW9qb1Rlc3QoCi0gICAgU3RyaW5nIHRlc3ROYW1lKQotICB7Ci0gICAgc3VwZXIodGVzdE5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgTW9qbyBtb2pvID0gbmV3IEdlbmVyYXRlRmFjZXNDb25maWdNb2pvKCk7Ci0gICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZSgidGFyZ2V0L21vam8tdGVzdC1vdXRwdXQvamF2YSIpOwotCi0gICAgc2V0TW9qb1Byb2plY3QobW9qbywgInByb2plY3QiKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgImNvbmZpZ0RpcmVjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzIikpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAiY29uZmlnUGF0aCIsICJNRVRBLUlORi9mYWNlcy1jb25maWcueG1sIik7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJ0YXJnZXREaXJlY3RvcnkiLCB0YXJnZXREaXIpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAiZm9yY2UiLCBCb29sZWFuLlRSVUUpOwotCi0gICAgX21vam8gPSBtb2pvOwotICAgIF90YXJnZXREaXIgPSB0YXJnZXREaXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpCi0gIHsKLSAgICBfbW9qbyA9IG51bGw7Ci0gICAgX3RhcmdldERpciA9IG51bGw7Ci0gIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbgotICB7Ci0gICAgX21vam8uZXhlY3V0ZSgpOwotCi0gICAgLy8gVE9ETzogdmVyaWZ5IGNvbnRlbnQgaXMgY29ycmVjdCEgCi0gIH0KLQotICBwcml2YXRlIE1vam8gX21vam87Ci0gIHByaXZhdGUgRmlsZSBfdGFyZ2V0RGlyOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL0NvbXBvbmVudC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvQ29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMDJmNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvQ29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0NCi0gIDxjb21wb25lbnQ+ICANCi0gIA0KLSAgICA8Y29tcG9uZW50LXR5cGU+amF2YXguZmFjZXMuQ29tcG9uZW50PC9jb21wb25lbnQtdHlwZT4NCi0gICAgPGNvbXBvbmVudC1jbGFzcz5qYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ8L2NvbXBvbmVudC1jbGFzcz4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPmlkPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5TdHJpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOmxpdGVyYWwtb25seT50cnVlPC9tZnA6bGl0ZXJhbC1vbmx5Pg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+cmVuZGVyZWQ8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmJvb2xlYW48L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxkZWZhdWx0LXZhbHVlPnRydWU8L2RlZmF1bHQtdmFsdWU+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5iaW5kaW5nPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5qYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+dHJhbnNpZW50PC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5ib29sZWFuPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpsaXRlcmFsLW9ubHk+dHJ1ZTwvbWZwOmxpdGVyYWwtb25seT4NCi0gICAgICAgIDxtZnA6dHJhbnNpZW50PnRydWU8L21mcDp0cmFuc2llbnQ+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5yZW5kZXJlclR5cGU8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPlN0cmluZzwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6bGl0ZXJhbC1vbmx5PnRydWU8L21mcDpsaXRlcmFsLW9ubHk+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICA8L2NvbXBvbmVudD4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvQ29tcG9uZW50QmFzZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvQ29tcG9uZW50QmFzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjE3MjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL0NvbXBvbmVudEJhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLQ0KLSAgPGNvbXBvbmVudD4gIA0KLSAgDQotICAgIDxjb21wb25lbnQtdHlwZT5qYXZheC5mYWNlcy5Db21wb25lbnRCYXNlPC9jb21wb25lbnQtdHlwZT4NCi0gICAgPGNvbXBvbmVudC1jbGFzcz5qYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnRCYXNlPC9jb21wb25lbnQtY2xhc3M+DQotDQotICAgIDxjb21wb25lbnQtZXh0ZW5zaW9uPg0KLSAgICAgIDxtZnA6Y29tcG9uZW50Pg0KLSAgICAgICAgPG1mcDpjb21wb25lbnQtc3VwZXJ0eXBlPmphdmF4LmZhY2VzLkNvbXBvbmVudDwvbWZwOmNvbXBvbmVudC1zdXBlcnR5cGU+DQotICAgICAgPC9tZnA6Y29tcG9uZW50Pg0KLSAgICA8L2NvbXBvbmVudC1leHRlbnNpb24+DQotICAgIA0KLSAgPC9jb21wb25lbnQ+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL05hbWluZ0NvbnRhaW5lci54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvTmFtaW5nQ29udGFpbmVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5ZTRkYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvTmFtaW5nQ29udGFpbmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotDQotICA8Y29tcG9uZW50Pg0KLQ0KLSAgICA8Y29tcG9uZW50LXR5cGU+amF2YXguZmFjZXMuTmFtaW5nQ29udGFpbmVyPC9jb21wb25lbnQtdHlwZT4NCi0gICAgPGNvbXBvbmVudC1jbGFzcz5qYXZheC5mYWNlcy5jb21wb25lbnQuVUlOYW1pbmdDb250YWluZXI8L2NvbXBvbmVudC1jbGFzcz4NCi0gICAgDQotICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICBBIHNpbXBsZSBuYW1pbmcgY29udGFpbmVyLg0KLSAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICANCi0gICAgPGNvbXBvbmVudC1leHRlbnNpb24+DQotICAgICAgPG1mcDpjb21wb25lbnQtZmFtaWx5PmphdmF4LmZhY2VzLk5hbWluZ0NvbnRhaW5lcjwvbWZwOmNvbXBvbmVudC1mYW1pbHk+DQotICAgICAgPG1mcDpuYW1pbmctY29udGFpbmVyPnRydWU8L21mcDpuYW1pbmctY29udGFpbmVyPg0KLSAgICAgIDxtZnA6ZWNtYXNjcmlwdC1jbGFzcz5jb21wb25lbnQuVUlOYW1pbmdDb250YWluZXI8L21mcDplY21hc2NyaXB0LWNsYXNzPg0KLSAgICA8L2NvbXBvbmVudC1leHRlbnNpb24+DQotICAgICAgDQotICA8L2NvbXBvbmVudD4NCi0NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tbWFuZC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tbWFuZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjkzODguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbW1hbmQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczphZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotDQotICA8Y29tcG9uZW50PiAgDQotICANCi0gICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Db21tYW5kPC9jb21wb25lbnQtdHlwZT4NCi0gICAgPGNvbXBvbmVudC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LlVJWENvbW1hbmQ8L2NvbXBvbmVudC1jbGFzcz4NCi0NCi0gICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgIEEgYmFzZSBhYnN0cmFjdGlvbiBmb3IgY29tcG9uZW50cyB0aGF0IGltcGxlbWVudCBBY3Rpb25Tb3VyY2UuDQotICAgIDwvZGVzY3JpcHRpb24+DQotDQotICAgIDx4aTppbmNsdWRlIGhyZWY9IlRlc3RJbmNsdWRlLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvY29tcG9uZW50LyoiPjwveGk6aW5jbHVkZT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPmFjdGlvbjwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+amF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZzwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBKYXZhIG1ldGhvZCB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuDQotICAgICAgICAgIGFuIEFjdGlvbkV2ZW50IGlzIGJyb2FkY2FzdCBieSB0aGlzIGNvbXBvbmVudC4gIFRoZSBtZXRob2QNCi0gICAgICAgICAgc2lnbmF0dXJlIHRha2VzIHplcm8gcGFyYW1ldGVycyBhbmQgbWF5IHJldHVybiBTdHJpbmcgb3Igdm9pZC4NCi0gICAgICAgICAgSWYgYSBub24tbnVsbCBTdHJpbmcgdmFsdWUgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgdXNlZCBhcw0KLSAgICAgICAgICBhbiBvdXRjb21lIGZvciBuYXZpZ2F0aW9uLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6c3RhdGUtaG9sZGVyPnRydWU8L21mcDpzdGF0ZS1ob2xkZXI+DQotICAgICAgICA8bWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICAgICAgPG1mcDpyZXR1cm4tdHlwZT5TdHJpbmc8L21mcDpyZXR1cm4tdHlwZT4NCi0gICAgICAgIDwvbWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICAgIDxtZDphdHRyaWJ1dGVNZXRhZGF0YT4NCi0gICAgICAgICAgPG1kOnByZWZlcnJlZD50cnVlPC9tZDpwcmVmZXJyZWQ+DQotICAgICAgICA8L21kOmF0dHJpYnV0ZU1ldGFkYXRhPg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+YWN0aW9uTGlzdGVuZXI8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgSmF2YSBtZXRob2QgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbg0KLSAgICAgICAgICBhbiBBY3Rpb25FdmVudCBpcyBicm9hZGNhc3QgYnkgdGhpcyBjb21wb25lbnQuICBUaGUgbWV0aG9kDQotICAgICAgICAgIHNpZ25hdHVyZSB0YWtlcyBhIHNpbmdsZSBBY3Rpb25FdmVudCBwYXJhbWV0ZXIgYW5kIHJldHVybnMNCi0gICAgICAgICAgdm9pZC4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOnN0YXRlLWhvbGRlcj50cnVlPC9tZnA6c3RhdGUtaG9sZGVyPg0KLSAgICAgICAgPG1mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgICAgIDxtZnA6cGFyYW1ldGVyLXR5cGU+amF2YXguZmFjZXMuZXZlbnQuQWN0aW9uRXZlbnQ8L21mcDpwYXJhbWV0ZXItdHlwZT4NCi0gICAgICAgICAgPG1mcDpyZXR1cm4tdHlwZT52b2lkPC9tZnA6cmV0dXJuLXR5cGU+DQotICAgICAgICA8L21mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgICA8bWQ6YXR0cmlidXRlTWV0YWRhdGE+DQotICAgICAgICAgIDxtZDpwcmVmZXJyZWQ+dHJ1ZTwvbWQ6cHJlZmVycmVkPg0KLSAgICAgICAgPC9tZDphdHRyaWJ1dGVNZXRhZGF0YT4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPnJldHVybkxpc3RlbmVyPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5qYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgIFRoZSByZWZlcmVuY2UgdG8gdGhlIEphdmEgbWV0aG9kIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4NCi0gICAgICAgICAgYSBkaWFsb2cgUmV0dXJuRXZlbnQgaXMgYnJvYWRjYXN0IGJ5IHRoaXMgY29tcG9uZW50LiAgVGhlIG1ldGhvZA0KLSAgICAgICAgICBzaWduYXR1cmUgdGFrZXMgYSBzaW5nbGUgUmV0dXJuRXZlbnQgcGFyYW1ldGVyIGFuZCByZXR1cm5zDQotICAgICAgICAgIHZvaWQuDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpzdGF0ZS1ob2xkZXI+dHJ1ZTwvbWZwOnN0YXRlLWhvbGRlcj4NCi0gICAgICAgIDxtZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgICAgICA8bWZwOnBhcmFtZXRlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5SZXR1cm5FdmVudDwvbWZwOnBhcmFtZXRlci10eXBlPg0KLSAgICAgICAgICA8bWZwOnJldHVybi10eXBlPnZvaWQ8L21mcDpyZXR1cm4tdHlwZT4NCi0gICAgICAgIDwvbWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPmltbWVkaWF0ZTwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+Ym9vbGVhbjwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgYSByZWZlcmVuY2UgdG8gYW4gYWN0aW9uIG1ldGhvZCBzZW50IGJ5IHRoZSBjb21tYW5kIGNvbXBvbmVudCwgDQotb3IgdGhlIHN0YXRpYyBvdXRjb21lIG9mIGFuIGFjdGlvbi4gIFdoZW4gaW1tZWRpYXRlIGlzIHRydWUsIHRoZSANCi1kZWZhdWx0IEFjdGlvbkxpc3RlbmVyIHByb3ZpZGVkIGJ5IHRoZSBKYXZhU2VydmVyIEZhY2VzIGltcGxlbWVudGF0aW9uIA0KLXNob3VsZCBiZSBleGVjdXRlZCBkdXJpbmcgQXBwbHkgUmVxdWVzdCBWYWx1ZXMgcGhhc2Ugb2YgdGhlIHJlcXVlc3QgDQotcHJvY2Vzc2luZyBsaWZlY3ljbGUsIHJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgdGhlIEludm9rZSBBcHBsaWNhdGlvbiANCi1waGFzZS4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOnJlcXVpcmVkPmZhbHNlPC9tZnA6cmVxdWlyZWQ+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxjb21wb25lbnQtZXh0ZW5zaW9uPg0KLSAgICAgIDxtZnA6Y29tcG9uZW50LWZhbWlseT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ29tbWFuZDwvbWZwOmNvbXBvbmVudC1mYW1pbHk+DQotICAgICAgPG1mcDpkZWZhdWx0LXJlbmRlcmVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkJ1dHRvbjwvbWZwOmRlZmF1bHQtcmVuZGVyZXItdHlwZT4NCi0gICAgICA8bWZwOmNvbXBvbmVudC1zdXBlcnR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNvbXBvbmVudEJhc2U8L21mcDpjb21wb25lbnQtc3VwZXJ0eXBlPg0KLQ0KLSAgICAgIDxtZnA6anNwLXRhZy1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIuVUlYQ29tbWFuZFRhZzwvbWZwOmpzcC10YWctY2xhc3M+DQotICAgICAgPG1mcDpqc3AtdGFnLW5hbWU+YWY6Y29tbWFuZDwvbWZwOmpzcC10YWctbmFtZT4NCi0NCi0gICAgICA8bWZwOmV2ZW50Pg0KLSAgICAgICAgPG1mcDpldmVudC10eXBlPmphdmF4LmZhY2VzLkFjdGlvbjwvbWZwOmV2ZW50LXR5cGU+DQotICAgICAgICA8bWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz5JbnZva2UgQXBwbGljYXRpb24sQXBwbHkgUmVxdWVzdCBWYWx1ZXM8L21mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+DQotICAgICAgPC9tZnA6ZXZlbnQ+DQotDQotICAgICAgPG1mcDpldmVudD4NCi0gICAgICAgIDxtZnA6ZXZlbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGF1bmNoPC9tZnA6ZXZlbnQtdHlwZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPkludm9rZSBBcHBsaWNhdGlvbixBcHBseSBSZXF1ZXN0IFZhbHVlczwvbWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz4NCi0gICAgICA8L21mcDpldmVudD4NCi0NCi0gICAgICA8bWZwOmV2ZW50Pg0KLSAgICAgICAgPG1mcDpldmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZXR1cm48L21mcDpldmVudC10eXBlPg0KLSAgICAgICAgPG1mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+QXBwbHkgUmVxdWVzdCBWYWx1ZXM8L21mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+DQotICAgICAgPC9tZnA6ZXZlbnQ+DQotDQotICAgICAgPG1kOmVsZW1lbnRNZXRhZGF0YT4NCi0gICAgICAgIDxtZDpncm91cD4ke21kOmdldFRyYW5zbGF0ZWRTdHJpbmcoIlBBTEVUVEVfSU5QVVQiKX08L21kOmdyb3VwPg0KLSAgICAgIDwvbWQ6ZWxlbWVudE1ldGFkYXRhPg0KLSAgICA8L2NvbXBvbmVudC1leHRlbnNpb24+DQotDQotICA8L2NvbXBvbmVudD4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tcG9uZW50QmFzZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tcG9uZW50QmFzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDFlYzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbXBvbmVudEJhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLQ0KLSAgPGNvbXBvbmVudD4gIA0KLSAgDQotICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ29tcG9uZW50QmFzZTwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5VSVhDb21wb25lbnRCYXNlPC9jb21wb25lbnQtY2xhc3M+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5hdHRyaWJ1dGVDaGFuZ2VMaXN0ZW5lcjwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+amF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZzwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBKYXZhIG1ldGhvZCB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuDQotICAgICAgICAgIGFuIEF0dHJpYnV0ZUNoYW5nZUV2ZW50IGlzIGJyb2FkY2FzdCBieSB0aGlzIGNvbXBvbmVudC4gIFRoZSANCi0gICAgICAgICAgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBhIHNpbmdsZSBBdHRyaWJ1dGVDaGFuZ2VFdmVudCBwYXJhbWV0ZXIgDQotICAgICAgICAgIGFuZCByZXR1cm5zIHZvaWQuDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpzdGF0ZS1ob2xkZXI+dHJ1ZTwvbWZwOnN0YXRlLWhvbGRlcj4NCi0gICAgICAgIDxtZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgICAgICA8bWZwOnBhcmFtZXRlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5BdHRyaWJ1dGVDaGFuZ2VFdmVudDwvbWZwOnBhcmFtZXRlci10eXBlPg0KLSAgICAgICAgICA8bWZwOnJldHVybi10eXBlPnZvaWQ8L21mcDpyZXR1cm4tdHlwZT4NCi0gICAgICAgIDwvbWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPGNvbXBvbmVudC1leHRlbnNpb24+DQotICAgICAgPG1mcDpjb21wb25lbnQtc3VwZXJ0eXBlPmphdmF4LmZhY2VzLkNvbXBvbmVudDwvbWZwOmNvbXBvbmVudC1zdXBlcnR5cGU+DQotDQotICAgICAgPG1mcDpqc3AtdGFnLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi5VSVhDb21wb25lbnRUYWc8L21mcDpqc3AtdGFnLWNsYXNzPg0KLSAgICAgIDxtZnA6ZXZlbnQ+DQotICAgICAgICA8bWZwOmV2ZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkF0dHJpYnV0ZUNoYW5nZTwvbWZwOmV2ZW50LXR5cGU+DQotICAgICAgICA8bWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz5JbnZva2UgQXBwbGljYXRpb24sQXBwbHkgUmVxdWVzdCBWYWx1ZXM8L21mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+DQotICAgICAgPC9tZnA6ZXZlbnQ+DQotICAgIDwvY29tcG9uZW50LWV4dGVuc2lvbj4NCi0NCi0gIDwvY29tcG9uZW50Pg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9UZXN0SW5jbHVkZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvVGVzdEluY2x1ZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTY0OTBhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9UZXN0SW5jbHVkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6YWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLQ0KLSAgPGNvbXBvbmVudD4gIA0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+aW5jbHVkZWRQcm9wZXJ0eTwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBqdXN0IGEgdGVzdC4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWQ6YXR0cmlidXRlTWV0YWRhdGE+DQotICAgICAgICAgIDxtZDpwcmVmZXJyZWQ+dHJ1ZTwvbWQ6cHJlZmVycmVkPg0KLSAgICAgICAgPC9tZDphdHRyaWJ1dGVNZXRhZGF0YT4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0gIDwvY29tcG9uZW50Pg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL2phdmF4L2ZhY2VzL0FjdGlvbi54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy9qYXZheC9mYWNlcy9BY3Rpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWU0MDU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL2phdmF4L2ZhY2VzL0FjdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotICA8ZmFjZXMtY29uZmlnLWV4dGVuc2lvbj4NCi0gICAgPG1mcDpldmVudD4NCi0gICAgICA8bWZwOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgRXZlbnQgZGVsaXZlcmVkIHdoZW4gdGhlICJhY3Rpb24iIG9mIHRoZSBjb21wb25lbnQgaGFzIGJlZW4NCi1pbnZva2VkOyAgZm9yIGV4YW1wbGUsIGJ5IGNsaWNraW5nIG9uIGEgYnV0dG9uLiAgVGhlIGFjdGlvbiBtYXkgcmVzdWx0DQotaW4gcGFnZSBuYXZpZ2F0aW9uLg0KLSAgICAgIDwvbWZwOmRlc2NyaXB0aW9uPg0KLSAgICAgIDxtZnA6ZXZlbnQtdHlwZT5qYXZheC5mYWNlcy5BY3Rpb248L21mcDpldmVudC10eXBlPg0KLSAgICAgIDxtZnA6ZXZlbnQtY2xhc3M+amF2YXguZmFjZXMuZXZlbnQuQWN0aW9uRXZlbnQ8L21mcDpldmVudC1jbGFzcz4NCi0gICAgICA8bWZwOmV2ZW50LWxpc3RlbmVyLWNsYXNzPmphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkxpc3RlbmVyPC9tZnA6ZXZlbnQtbGlzdGVuZXItY2xhc3M+DQotICAgICAgPG1mcDpldmVudC1zb3VyY2UtaW50ZXJmYWNlPmphdmF4LmZhY2VzLmNvbXBvbmVudC5BY3Rpb25Tb3VyY2U8L21mcDpldmVudC1zb3VyY2UtaW50ZXJmYWNlPg0KLSAgICAgIDxtZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPkludm9rZSBBcHBsaWNhdGlvbixBcHBseSBSZXF1ZXN0IFZhbHVlczwvbWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz4NCi0gICAgPC9tZnA6ZXZlbnQ+DQotICA8L2ZhY2VzLWNvbmZpZy1leHRlbnNpb24+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvdHJpbmlkYWQvZmFjZXMvTGF1bmNoLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL0xhdW5jaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZGMxYzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvdHJpbmlkYWQvZmFjZXMvTGF1bmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0gIDxmYWNlcy1jb25maWctZXh0ZW5zaW9uPg0KLSAgICAgIDxtZnA6ZXZlbnQ+DQotICAgICAgICA8bWZwOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBFdmVudCBkZWxpdmVyZWQgdG8gcHJvbXB0IHRoZSBjb21tYW5kIHRvIGxhdW5jaCBhIGRpYWxvZy4NCi0gICAgICAgIDwvbWZwOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgPG1mcDpldmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5MYXVuY2g8L21mcDpldmVudC10eXBlPg0KLSAgICAgICAgPG1mcDpldmVudC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuTGF1bmNoRXZlbnQ8L21mcDpldmVudC1jbGFzcz4NCi0gICAgICAgIDxtZnA6ZXZlbnQtbGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LkxhdW5jaExpc3RlbmVyPC9tZnA6ZXZlbnQtbGlzdGVuZXItY2xhc3M+DQotICAgICAgICA8bWZwOmV2ZW50LXNvdXJjZS1pbnRlcmZhY2U+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5EaWFsb2dTb3VyY2U8L21mcDpldmVudC1zb3VyY2UtaW50ZXJmYWNlPg0KLSAgICAgICAgPG1mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+SW52b2tlIEFwcGxpY2F0aW9uLEFwcGx5IFJlcXVlc3QgVmFsdWVzPC9tZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPg0KLSAgICAgIDwvbWZwOmV2ZW50Pg0KLSAgPC9mYWNlcy1jb25maWctZXh0ZW5zaW9uPg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL1JldHVybi54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy90cmluaWRhZC9mYWNlcy9SZXR1cm4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzAzNDdjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL1JldHVybi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotICA8ZmFjZXMtY29uZmlnLWV4dGVuc2lvbj4NCi0gICAgICA8bWZwOmV2ZW50Pg0KLSAgICAgICAgPG1mcDpkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgRXZlbnQgZGVsaXZlcmVkIHdoZW4gdGhlIGRpYWxvZyBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4NCi0gICAgICAgIDwvbWZwOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgPG1mcDpldmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZXR1cm48L21mcDpldmVudC10eXBlPg0KLSAgICAgICAgPG1mcDpldmVudC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuUmV0dXJuRXZlbnQ8L21mcDpldmVudC1jbGFzcz4NCi0gICAgICAgIDxtZnA6ZXZlbnQtbGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LlJldHVybkxpc3RlbmVyPC9tZnA6ZXZlbnQtbGlzdGVuZXItY2xhc3M+DQotICAgICAgICA8bWZwOmV2ZW50LXNvdXJjZS1pbnRlcmZhY2U+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5EaWFsb2dTb3VyY2U8L21mcDpldmVudC1zb3VyY2UtaW50ZXJmYWNlPg0KLSAgICAgICAgPG1mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+QXBwbHkgUmVxdWVzdCBWYWx1ZXM8L21mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+DQotICAgICAgPC9tZnA6ZXZlbnQ+DQotICA8L2ZhY2VzLWNvbmZpZy1leHRlbnNpb24+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmVlNDU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21tYW5kLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iZXZlbnRzL2phdmF4L2ZhY2VzL0FjdGlvbi54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImV2ZW50cy90cmluaWRhZC9mYWNlcy9MYXVuY2gueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotICA8eGk6aW5jbHVkZSBocmVmPSJldmVudHMvdHJpbmlkYWQvZmFjZXMvUmV0dXJuLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdEdlbmVyYXRlLmxzdCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdEdlbmVyYXRlLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZTQ1Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RHZW5lcmF0ZS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImNvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tbWFuZC54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImV2ZW50cy9qYXZheC9mYWNlcy9BY3Rpb24ueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotICA8eGk6aW5jbHVkZSBocmVmPSJldmVudHMvdHJpbmlkYWQvZmFjZXMvTGF1bmNoLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL1JldHVybi54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RTa2lwQVBJLmxzdCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdFNraXBBUEkubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWE1MWJkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdFNraXBBUEkubHN0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY29tcG9uZW50cy9qYXZheC9mYWNlcy9OYW1pbmdDb250YWluZXIueG1sCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNzRlNjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0Ci0gIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtaTE4bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBpMThuIFBsdWdpbjwvbmFtZT4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzb3VyY2U+MS40PC9zb3VyY2U+Ci0gICAgICAgICAgPHRhcmdldD4xLjQ8L3RhcmdldD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL0dlbmVyYXRlSmF2YXNjcmlwdExvY2FsZXNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL0dlbmVyYXRlSmF2YXNjcmlwdExvY2FsZXNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDg0YmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi9HZW5lcmF0ZUphdmFzY3JpcHRMb2NhbGVzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5pMThuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5pMThuLnVpeHRvb2xzLkpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLlJlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgZ2VuZXJhdGUtamF2YXNjcmlwdC1sb2NhbGVzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVKYXZhc2NyaXB0TG9jYWxlc01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGFkZCBnZW5lcmF0ZWQgc291cmNlcyB0byBjb21waWxhdGlvbiBjbGFzc3BhdGgKLSAgICAgIGFkZFJlc291cmNlUm9vdCh0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgICAgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHRhcmdldFBhdGgpOwotCi0gICAgICAvLyBJbmNyZW1lbnRhbCBjaGVjawotICAgICAgYm9vbGVhbiB1cHRvZGF0ZSA9IGZhbHNlOwotCi0gICAgICAvLyBUT0RPOiBkZXRlcm1pbmUgaG93IGJlc3QgdG8gY2hlY2sgZm9yIGluY3JlbWVudGFsCi0vLyAgICAgIGlmICghZm9yY2UpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmdbXSBsb2NhbGVTdHJpbmdzID0gZ2V0TG9jYWxlU3RyaW5ncygpOwotLy8gICAgICAgIFN0cmluZyBidW5kbGVQYXRoID0gSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvci5fREVGQVVMVF9CVU5ETEVfTE9DQVRJT05fUEFUSDsKLS8vICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsb2NhbGVTdHJpbmdzLmxlbmd0aDsgaSsrKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBwYXRoID0gYnVuZGxlUGF0aCArICJMb2NhbGVFbGVtZW50cyIgKwotLy8gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVTdHJpbmdzW2ldICsgIi5qYXZhIjsKLS8vICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgcGF0aCk7Ci0vLyAgICAgICAgICBpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHVwdG9kYXRlID0gZmFsc2U7Ci0vLyAgICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotCi0gICAgICBpZiAoZm9yY2UgfHwgIXVwdG9kYXRlKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIEphdmFzY3JpcHQgTG9jYWxlcyIpOwotCi0gICAgICAgIExpc3QgYXJnc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgYXJnc0xpc3QuYWRkKCJvdXREaXI9IiArIG91dHB1dERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICBhcmdzTGlzdC5hZGQoIndyaXRlSmF2YXNjcmlwdD10cnVlIik7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgid3JpdGVTb3VyY2U9ZmFsc2UiKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJ2ZXJib3NlPWZhbHNlIik7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgicHJldHR5UHJpbnQ9dHJ1ZSIpOwotCi0gICAgICAgIFN0cmluZ1tdIGFyZ3MgPSAoU3RyaW5nW10pYXJnc0xpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvci5tYWluKGFyZ3MpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gSmF2YXNjcmlwdCBMb2NhbGVzIGFyZSB1cCB0byBkYXRlIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIC8vIFRPRE86IHVzZSBwcm9qZWN0LmFkZFJlc291cmNlUm9vdCgpCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlUm9vdCgKLSAgICBTdHJpbmcgcmVzb3VyY2VSb290KQotICB7Ci0gICAgTGlzdCByZXNvdXJjZXMgPSBwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKLSAgICByZXNvdXJjZS5zZXREaXJlY3RvcnkocmVzb3VyY2VSb290KTsKLSAgICByZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0TG9jYWxlU3RyaW5ncygpCi0gIHsKLSAgICBpZiAoImVuX1VTIi5lcXVhbHMobG9jYWxlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgIiIgfTsKLSAgICB9Ci0KLSAgICBMb2NhbGVbXSBsb2NhbGVzID0gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKLSAgICBTdHJpbmdbXSBsb2NhbGVTdHJpbmdzID0gbmV3IFN0cmluZ1tsb2NhbGVzLmxlbmd0aF07Ci0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBsb2NhbGVTdHJpbmdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxvY2FsZVN0cmluZ3NbaV0gPSBsb2NhbGVzW2ldLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxvY2FsZVN0cmluZ3M7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWkxOG4tcGx1Z2luL21haW4vamF2YXNjcmlwdCIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0YXJnZXRQYXRoID0gIiI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGxvY2FsZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi9HZW5lcmF0ZUxvY2FsZUVsZW1lbnRzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi9HZW5lcmF0ZUxvY2FsZUVsZW1lbnRzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQ1OGJhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vR2VuZXJhdGVMb2NhbGVFbGVtZW50c01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uaTE4bjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uaTE4bi51aXh0b29scy5KU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCBnZW5lcmF0ZS1sb2NhbGUtZWxlbWVudHMKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUxvY2FsZUVsZW1lbnRzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gYWRkIGdlbmVyYXRlZCBzb3VyY2VzIHRvIGNvbXBpbGF0aW9uIGNsYXNzcGF0aAotICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCh0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgICAgLy8gSW5jcmVtZW50YWwgY2hlY2sKLSAgICAgIGJvb2xlYW4gdXB0b2RhdGUgPSB0cnVlOwotCi0gICAgICBpZiAoIWZvcmNlKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBsb2NhbGVTdHJpbmdzID0gZ2V0TG9jYWxlU3RyaW5ncygpOwotICAgICAgICBTdHJpbmcgYnVuZGxlUGF0aCA9IEpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IuX0RFRkFVTFRfQlVORExFX0xPQ0FUSU9OX1BBVEg7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxvY2FsZVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcGF0aCA9IGJ1bmRsZVBhdGggKyAiTG9jYWxlRWxlbWVudHMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZVN0cmluZ3NbaV0gKyAiLmphdmEiOwotICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgcGF0aCk7Ci0gICAgICAgICAgaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwdG9kYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGZvcmNlIHx8ICF1cHRvZGF0ZSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBMb2NhbGVFbGVtZW50cyIpOwotCi0gICAgICAgIExpc3QgYXJnc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgYXJnc0xpc3QuYWRkKCJzb3VyY2VEaXI9IiArIHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICBhcmdzTGlzdC5hZGQoImJ1bmRsZU91dERpcj0iICsgdGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgid3JpdGVKYXZhc2NyaXB0PWZhbHNlIik7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgid3JpdGVTb3VyY2U9dHJ1ZSIpOwotICAgICAgICBhcmdzTGlzdC5hZGQoImdlbmVyYXRlQnVuZGxlQmFzZU9ubHk9IiArICgiZW5fVVMiLmVxdWFscyhsb2NhbGUpKSk7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgidmVyYm9zZT1mYWxzZSIpOwotICAgICAgICBhcmdzTGlzdC5hZGQoInByZXR0eVByaW50PXRydWUiKTsKLQotICAgICAgICBTdHJpbmdbXSBhcmdzID0gKFN0cmluZ1tdKWFyZ3NMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgIEpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IubWFpbihhcmdzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIExvY2FsZUVsZW1lbnRzIGFyZSB1cCB0byBkYXRlIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0TG9jYWxlU3RyaW5ncygpCi0gIHsKLSAgICBpZiAoImVuX1VTIi5lcXVhbHMobG9jYWxlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgIiIgfTsKLSAgICB9Ci0KLSAgICBMb2NhbGVbXSBsb2NhbGVzID0gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKLSAgICBTdHJpbmdbXSBsb2NhbGVTdHJpbmdzID0gbmV3IFN0cmluZ1tsb2NhbGVzLmxlbmd0aF07Ci0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBsb2NhbGVTdHJpbmdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxvY2FsZVN0cmluZ3NbaV0gPSBsb2NhbGVzW2ldLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxvY2FsZVN0cmluZ3M7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWkxOG4tcGx1Z2luL21haW4vamF2YSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBsb2NhbGU7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vdWl4dG9vbHMvSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi91aXh0b29scy9KU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDVkZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi91aXh0b29scy9KU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmkxOG4udWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9sczsKLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEdlbmVyYXRlcyBKYXZhU2NyaXB0IGxpYnJhcmllcyBjb250YWluaW5nIHRoZSBMb2NhbGUgaW5mb3JtYXRpb24gZnJvbQotICogSmF2YS4KLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uOiAxLjMgJCkgJERhdGU6IDIwMDQvMDMvMjUgMjI6MzY6NDIgJAotICovCi1wdWJsaWMgY2xhc3MgSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvcgotewotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbigKLSAgICBTdHJpbmdbXSBhcmdzCi0gICAgKQotICB7Ci0KLSAgICBpZiAoKGFyZ3MubGVuZ3RoID09IDEpICYmICgiPyIuZXF1YWxzKGFyZ3NbMF0pKSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRlcyBKYXZhU2NyaXB0IExvY2FsZSBpbmZvcm1hdGlvbiBmaWxlcyIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb3IgdGhlIExvY2FsZXMgYXZhaWxhYmxlIGluIHRoZSBKVk0uIik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXNlIGZpbGVzIGFyZSB1c2VkIGJ5IHRoZSBDYWJvIEhUTUwgY2xpZW50Iik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxvZ2ljIHRvIGhhbmRsZSBkYXRlIGZvcm1hdHRpbmcgYW5kIHZhbGlkYXRpb24uIik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW1ldGVyczoiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRwcmV0dHlQcmludD1mYWxzZVx0VHVybnMgb2ZmIHByZXR0eSBwcmludGVkIG91dHB1dCIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdG91dERpcj1bcGF0aF1cdFx0RGlyZWN0b3J5IHBhdGggdG8gd3JpdGUgSmF2YVNjcmlwdCBmaWxlcyB0byIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdHNvdXJjZURpcj1bcGF0aF1cdFx0Um9vdCBkaXJlY3RvcnkgcGF0aCB0byB3cml0ZSBKYXZhIHNvdXJjZSB0byIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICJcdGJ1bmRsZU91dERpcj1bcGF0aF1cdFx0Um9vdCBkaXJlY3RvcnkgcGF0aCB0byB3cml0ZSAiICsKLSAgICAgICAgICAiSmF2YSBSZXNvdXJjZUJ1bmRsZXMgdG8gKGRlZmF1bHRzIHRvIHNvdXJjZURpcikuIik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgIlx0dmFyaWFudD1bdmFyaWFudCBuYW1lXVx0XHRJZiBzdXBwbGllZCB1dGlsaXR5IHdpbGwgZ2VuZXJhdGUgIiArCi0gICAgICAgICAgIlJlc291cmNlQnVuZGxlcyBmb3IgdGhpcyB2YXJpYW50LCBhbmQgbm90aGluZyBlbHNlLiIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdHZlcmJvc2U9dHJ1ZVx0XHRUdXJucyBvbiB2ZXJib3NlIG91dHB1dCIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdGdlbmVyYXRlQnVuZGxlQmFzZU9ubHk9dHJ1ZVx0XHRHZW5lcmF0ZXMgdGhlIGJhc2UgTG9jYWxlRWxlbWVudC5qYXZhIGZpbGUgb25seSIpOwotICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotCi0gICAgLy8gd2hldGhlciB0aGUgb3V0cHV0IHNob3VsZCBiZSBwcmV0dHkgcHJpbnRlZCBmb3IgbGVnaWJpbGl0eQotICAgIGJvb2xlYW4gcHJldHR5UHJpbnQgPSBnZXRBcmdCb29sZWFuVmFsdWUoYXJncywgInByZXR0eVByaW50IiwgdHJ1ZSk7Ci0KLSAgICAvLyB3aGV0aGVyIHZlcmJvc2Ugb3VwdXQgc2hvdWxkIGJlIGdlbmVyYXRlZC4KLSAgICBib29sZWFuIHZlcmJvc2UgPSBnZXRBcmdCb29sZWFuVmFsdWUoYXJncywgInZlcmJvc2UiLCBmYWxzZSk7Ci0KLSAgICBib29sZWFuIHdyaXRlU291cmNlID0gZ2V0QXJnQm9vbGVhblZhbHVlKGFyZ3MsICJ3cml0ZVNvdXJjZSIsIHRydWUpOwotICAgIGJvb2xlYW4gd3JpdGVKYXZhc2NyaXB0ID0gZ2V0QXJnQm9vbGVhblZhbHVlKGFyZ3MsICJ3cml0ZUphdmFzY3JpcHQiLCB0cnVlKTsKLQotICAgIC8vIHdoZXRoZXIgb25seSB0aGUgQmFzZSBMb2NhbGVFbGVtZW50cy5qYXZhIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQuCi0gICAgLy8gdGhpcyBpcyBiYXNlZCBvbiB0aGUgTG9jYWxlLlVTCi0gICAgYm9vbGVhbiBnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5ID0gZ2V0QXJnQm9vbGVhblZhbHVlKGFyZ3MsImdlbmVyYXRlQnVuZGxlQmFzZU9ubHkiLGZhbHNlKTsKLQotICAgIC8vIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgU3RyaW5nIG91dERpciA9IGdldEFyZ1N0cmluZ1ZhbHVlKGFyZ3MsICJvdXREaXIiLCBudWxsKTsKLQotICAgIGlmIChvdXREaXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXREaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKwotICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKwotICAgICAgICAgICAgICAgX0RFRkFVTFRfTE9DQVRJT05fUEFUSDsKLSAgICB9Ci0KLSAgICBpZiAoIW91dERpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0gICAgewotICAgICAgb3V0RGlyID0gb3V0RGlyICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgfQotCi0KLSAgICAvLyB0aGUgcmVxdWVzdGVkIHZhcmlhbnQKLSAgICBTdHJpbmcgdmFyaWFudCA9IGdldEFyZ1N0cmluZ1ZhbHVlKGFyZ3MsICJ2YXJpYW50IiwgbnVsbCk7Ci0gICAgYm9vbGVhbiB3cml0ZUFsbCA9IHRydWU7Ci0gICAgaWYgKHZhcmlhbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3cml0ZUFsbCA9IGZhbHNlOwotICAgICAgdmFyaWFudCA9IHZhcmlhbnQudG9VcHBlckNhc2UoKTsKLSAgICB9Ci0KLSAgICAvLyB0aGUgc291cmNlIGRpcmVjdG9yeQotICAgIFN0cmluZyBzb3VyY2VEaXIgPSBnZXRBcmdTdHJpbmdWYWx1ZShhcmdzLCAic291cmNlRGlyIiwgbnVsbCk7Ci0KLSAgICBpZiAoc291cmNlRGlyID09IG51bGwpCi0gICAgewotICAgICAgc291cmNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotICAgIH0KLQotICAgIFN0cmluZyBidW5kbGVPdXREaXIgPSBnZXRBcmdTdHJpbmdWYWx1ZShhcmdzLCAiYnVuZGxlT3V0RGlyIiwgbnVsbCk7Ci0KLSAgICBpZiAoYnVuZGxlT3V0RGlyID09IG51bGwpCi0gICAgewotICAgICAgYnVuZGxlT3V0RGlyID0gc291cmNlRGlyOwotICAgIH0KLQotICAgIC8vIFRoZSBidW5kbGUgb3V0cHV0IGRpciBpcyB0aGUgYmFzZSBvZiB0aGUgaGVpcmFyY2h5LCB3ZSdsbCBhY3R1YWxseSBwdXQKLSAgICAvLyB0aGUgZmlsZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3ViIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UuCi0gICAgU3RyaW5nIGZ1bGxCdW5kbGVPdXREaXIgPSAoYnVuZGxlT3V0RGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoYnVuZGxlT3V0RGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZpbGUuc2VwYXJhdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfREVGQVVMVF9CVU5ETEVfTE9DQVRJT05fUEFUSCk7Ci0KLSAgICBTdHJpbmcgdmVyc2lvbiA9IGdldEFyZ1N0cmluZ1ZhbHVlKGFyZ3MsICJ2ZXJzaW9uIiwgbnVsbCk7Ci0gICAgdmVyc2lvbiA9IFZlcnNpb25VdGlscy5ub3JtYWxpemVWZXJzaW9uU3VmZml4KHZlcnNpb24pOwotCi0gICAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIGZpbGVzIHRvOiAiICsgb3V0RGlyKTsKLSAgICAgIGlmICh3cml0ZUFsbCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIHNvdXJjZSB0bzogIiArIHNvdXJjZURpcik7Ci0gICAgICB9Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgYnVuZGxlcyB0bzogIiArIGZ1bGxCdW5kbGVPdXREaXIpOwotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgbG9jYWxlTGlzdEZpbGUgPSBudWxsOwotCi0gICAgICBpZiAod3JpdGVTb3VyY2UpCi0gICAgICB7Ci0gICAgICAgIChuZXcgRmlsZShmdWxsQnVuZGxlT3V0RGlyKSkubWtkaXJzKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh3cml0ZUphdmFzY3JpcHQpCi0gICAgICB7Ci0gICAgICAgIChuZXcgRmlsZShvdXREaXIpKS5ta2RpcnMoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHdyaXRlQWxsICYmIHdyaXRlU291cmNlICYmICFnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5KQotICAgICAgewotICAgICAgICBsb2NhbGVMaXN0RmlsZSA9IG5ldyBGaWxlKHNvdXJjZURpciwgX0xPQ0FMRV9MSVNUX1BBVEgpOwotICAgICAgICBsb2NhbGVMaXN0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgIGxvY2FsZUxpc3RGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgIH0KLQotICAgICAgTG9jYWxlW10gbG9jYWxlcyA9IG51bGw7Ci0KLSAgICAgIGlmIChnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5KQotICAgICAgewotICAgICAgICAgbG9jYWxlcyA9IG5ldyBMb2NhbGVbMV07Ci0gICAgICAgICBsb2NhbGVzWzBdID0gTG9jYWxlLlVTOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsb2NhbGVzID0gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKLSAgICAgIH0KLQotICAgICAgLy8KLSAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIExvY2FsZXMsIHdyaXRpbmcgdGhlaXIgY29udGVudHMgb3V0Ci0gICAgICAvLyBhcyBKYXZhU2NyaXB0IGxpYnJhcmllcyBhbmQvb3IgUmVzb3VyY2VCdW5kbGVzCi0gICAgICAvLwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICAvLyB3cml0ZSB0aGUgSmF2YVNDcmlwdCBsaWJyYXJ5IGZvciB0aGlzIGxvY2FsZQotICAgICAgICBfZ2VuZXJhdGVKU0xvY2FsZUVsZW1lbnRzKG91dERpciwgZnVsbEJ1bmRsZU91dERpciwgbG9jYWxlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LCBwcmV0dHlQcmludCwgdmVyYm9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUphdmFzY3JpcHQsIHdyaXRlU291cmNlLCBnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5LCB2ZXJzaW9uKTsKLSAgICAgIH0KLQotICAgICAgLy8gQW5kIHdyaXRlIG91dCBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBsb2NhbGVzLCBidXQgIG5vdCB3aGVuIHdlIHdhbnQgdG8KLSAgICAgIC8vIGp1c3QgZ2VuZXJhdGUgdGhlIGJhc2UgUmVzb3VyY2UgZmlsZS4KLSAgICAgIGlmICh3cml0ZUFsbCAmJiB3cml0ZVNvdXJjZSAmJiAhZ2VuZXJhdGVCdW5kbGVCYXNlT25seSkKLSAgICAgIHsKLSAgICAgICAgV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGxvY2FsZUxpc3RGaWxlKTsKLSAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKF9MT0NBTEVfTElTVF9DT0RFX1NUQVJUKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUoIiAgICBuZXcgTG9jYWxlKFwiIik7Ci0gICAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKGxvY2FsZXNbaV0uZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKCJcIixcIiIpOwotICAgICAgICAgIHNvdXJjZVdyaXRlci53cml0ZShsb2NhbGVzW2ldLmdldENvdW50cnkoKSk7Ci0gICAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKCJcIixcIiIpOwotICAgICAgICAgIHNvdXJjZVdyaXRlci53cml0ZShsb2NhbGVzW2ldLmdldFZhcmlhbnQoKSk7Ci0gICAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKCJcIiksXG4iKTsKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUoX0xPQ0FMRV9MSVNUX0NPREVfRU5EKTsKLSAgICAgICAgc291cmNlV3JpdGVyLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIHdyaXRpbmcgZmlsZXMiKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXJnU3RyaW5nVmFsdWUoCi0gICAgU3RyaW5nW10gYXJncywKLSAgICBTdHJpbmcgICBhcmdOYW1lLAotICAgIFN0cmluZyAgIGRlZmF1bHRWYWx1ZQotICAgICkKLSAgewotICAgIGludCBhcmdMZW5ndGggPSBhcmdOYW1lLmxlbmd0aCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBjdXJyQXJnID0gYXJnc1tpXTsKLQotICAgICAgaWYgKGN1cnJBcmcuc3RhcnRzV2l0aChhcmdOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFjdXJyQXJnLmVxdWFscyhhcmdOYW1lKSAmJgotICAgICAgICAgICAgKCc9JyA9PSBjdXJyQXJnLmNoYXJBdChhcmdMZW5ndGgpKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBjdXJyQXJnLnN1YnN0cmluZyhhcmdMZW5ndGggKyAxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGdldEFyZ0Jvb2xlYW5WYWx1ZSgKLSAgICBTdHJpbmdbXSBhcmdzLAotICAgIFN0cmluZyAgIGFyZ05hbWUsCi0gICAgYm9vbGVhbiAgZGVmYXVsdFZhbHVlCi0gICAgKQotICB7Ci0gICAgLy8KLSAgICAvLyBjaGVjayBmb3IgPSB0cnVlIG9yID0gZmFsc2UKLSAgICAvLwotICAgIFN0cmluZyBhcmdWYWx1ZSA9IGdldEFyZ1N0cmluZ1ZhbHVlKGFyZ3MsIGFyZ05hbWUsIG51bGwpOwotCi0gICAgaWYgKGFyZ1ZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY2hlY2sgZm9yID0gc2VsZgotICAgICAgaWYgKGFyZ05hbWUuZXF1YWxzKGFyZ1ZhbHVlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoYXJnVmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8gY2hlY2sgZm9yIHRoZSBuYW1lIGJ5IGl0c2VsZgotICAgIC8vCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChhcmdzW2ldLmVxdWFscyhhcmdOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBjaGVjayBmb3IgdGhlIG5hbWUgdHVybmVkIG9mZgotICAgIC8vCi0gICAgU3RyaW5nIG5vdE5hbWUgPSAiLSIgKyBhcmdOYW1lOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChhcmdzW2ldLmVxdWFscyhub3ROYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIF9nZW5lcmF0ZUpTTG9jYWxlRWxlbWVudHMoCi0gICAgU3RyaW5nICBvdXREaXIsCi0gICAgU3RyaW5nICBidW5kbGVPdXREaXIsCi0gICAgTG9jYWxlICB0YXJnZXRMb2NhbGUsCi0gICAgU3RyaW5nICB2YXJpYW50LAotICAgIGJvb2xlYW4gcHJldHR5UHJpbnQsCi0gICAgYm9vbGVhbiB2ZXJib3NlLAotICAgIGJvb2xlYW4gd3JpdGVKYXZhc2NyaXB0LAotICAgIGJvb2xlYW4gd3JpdGVTb3VyY2UsCi0gICAgYm9vbGVhbiBnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5LAotICAgIFN0cmluZyB2ZXJzaW9uCi0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBmaWxlTmFtZTsKLSAgICBQcmludFdyaXRlciBsb2NhbGVXcml0ZXI7Ci0KLSAgICBpZiAodmFyaWFudCA9PSBudWxsICYmIHdyaXRlSmF2YXNjcmlwdCkKLSAgICB7Ci0gICAgICBmaWxlTmFtZSA9IF9nZXRGaWxlTmFtZSh0YXJnZXRMb2NhbGUsIHZlcnNpb24sIGdlbmVyYXRlQnVuZGxlQmFzZU9ubHkpICsgX0pBVkFTQ1JJUFRfRVhURU5TSU9OOwotCi0gICAgICBpZiAodmVyYm9zZSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nICIgKyBmaWxlTmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZSB0byB3cml0ZSB0bwotICAgICAgbG9jYWxlV3JpdGVyID0gbmV3IFByaW50V3JpdGVyCi0gICAgICAgIChuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0RGlyICsgZmlsZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ERUZBVUxUX0JVRkZFUl9TSVpFKSk7Ci0gICAgICBfd3JpdGVMb2NhbGUobG9jYWxlV3JpdGVyLCB0YXJnZXRMb2NhbGUsIHByZXR0eVByaW50KTsKLSAgICAgIGxvY2FsZVdyaXRlci5jbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgX3dyaXRlSmF2YUJ1bmRsZSgKLSAgICBXcml0ZXIgICAgICBvdXRwdXQsCi0gICAgTG9jYWxlICAgICAgdGFyZ2V0TG9jYWxlLAotICAgIFN0cmluZyAgICAgIGZpbGVOYW1lCi0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dHB1dC53cml0ZShfTE9DQUxFX0pBVkFfQ09ERV9TVEFSVCk7Ci0gICAgb3V0cHV0LndyaXRlKCJwdWJsaWMgY2xhc3MgIgotICAgICAgICAgICAgICAgICArIGZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICsgIiBleHRlbmRzIExpc3RSZXNvdXJjZUJ1bmRsZVxue1xuIgotICAgICAgICAgICAgICAgICArICIgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKClcbiAge1xuIgotICAgICAgICAgICAgICAgICArICIgICAgcmV0dXJuIGNvbnRlbnRzO1xuICB9XG5cbiIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlQnVuZGxlIGVsZW1lbnRzRGF0YSA9Ci0gICAgICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShfTE9DQUxFX0VMRU1FTlRTX1BBVEgsIHRhcmdldExvY2FsZSk7Ci0KLSAgICAgIGJvb2xlYW4gZG9uZU9uZSA9IGZhbHNlOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IExPQ0FMRV9FTEVNRU5UU19HRVRfS0VZUy5sZW5ndGg7IGkgKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyS2V5ID0gTE9DQUxFX0VMRU1FTlRTX0dFVF9LRVlTW2ldOwotCi0gICAgICAgIE9iamVjdCBkYXRhID0gX2dldEVsZW1lbnREYXRhKGN1cnJLZXksIGVsZW1lbnRzRGF0YSwgdGFyZ2V0TG9jYWxlKTsKLSAgICAgICAgX3dyaXRlSmF2YUJ1bmRsZUVsZW1lbnQob3V0cHV0LCBjdXJyS2V5LCBkYXRhLCBkb25lT25lKTsKLSAgICAgICAgZG9uZU9uZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBkb25lT25lID0gZmFsc2U7Ci0gICAgICBvdXRwdXQud3JpdGUoIiAgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSBcbiAge1xuIik7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IExPQ0FMRV9FTEVNRU5UU19HRVRfS0VZUy5sZW5ndGg7IGkgKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyS2V5ID0gTE9DQUxFX0VMRU1FTlRTX0dFVF9LRVlTW2ldOwotICAgICAgICBvdXRwdXQud3JpdGUoKGRvbmVPbmUgPyAiLFxuIiA6ICIiKQotICAgICAgICAgICAgICAgICAgICAgKyAiICAgIHsgXCIiCi0gICAgICAgICAgICAgICAgICAgICArIGN1cnJLZXkKLSAgICAgICAgICAgICAgICAgICAgICsgIlwiLCAiCi0gICAgICAgICAgICAgICAgICAgICArIF9nZXRLZXlBcnJheU5hbWUoY3VycktleSkKLSAgICAgICAgICAgICAgICAgICAgICsgIn0iKTsKLSAgICAgICAgZG9uZU9uZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBvdXRwdXQud3JpdGUoIlxuICB9OyIpOwotICAgIH0KLSAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGNsYXNzIHdpbGwsIGF0IGxlYXN0LCBjb21waWxlIGV2ZW4gaWYgaW5jb21wbGV0ZS4KLSAgICAgIG91dHB1dC53cml0ZSgiICAvLyBCdW5kbGUgZ2VuZXJhdGlvbiBlcnJvcjpcbiAgLy8gIiArIGUpOwotICAgICAgb3V0cHV0LndyaXRlKCJcbiAgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSBudWxsOyIpOwotICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgIH0KLSAgICBvdXRwdXQud3JpdGUoIlxufVxuIik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIF93cml0ZUxvY2FsZSgKLSAgICBXcml0ZXIgICAgICBvdXRwdXQsCi0gICAgTG9jYWxlICAgICAgdGFyZ2V0TG9jYWxlLAotICAgIGJvb2xlYW4gICAgIHByZXR0eVByaW50Ci0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCi0gICAgb3V0cHV0LndyaXRlKCJ2YXIgTG9jYWxlU3ltYm9sc18iKTsKLSAgICBvdXRwdXQud3JpdGUodGFyZ2V0TG9jYWxlLnRvU3RyaW5nKCkpOwotICAgIG91dHB1dC53cml0ZSgiID0gbmV3IExvY2FsZVN5bWJvbHMoeyIpOwotCi0gICAgaWYgKHByZXR0eVByaW50KQotICAgIHsKLSAgICAgIG91dHB1dC53cml0ZSgnXG4nKTsKLSAgICB9Ci0KLSAgICBFbnVtZXJhdGlvbiB6b25lRW51bWVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUVudW1lcmF0aW9uKERBVEVfRk9STUFUX1pPTkVfR0VUX0tFWVMpOwotCi0gICAgLy8gd3JpdGUgdGhlIGxvY2FsZSBlbGVtZW50cyBpbnRvIHRoZSBmaWxlCi0gICAgX3dyaXRlUmVzb3VyY2VDb250ZW50cyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfTE9DQUxFX0VMRU1FTlRTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlFbnVtZXJhdGlvbihMT0NBTEVfRUxFTUVOVFNfR0VUX0tFWVMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZUVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnQpOwotCi0gICAgLy8gd3JpdGUgdGhlIGRhdGUgZm9ybWF0IGVsZW1lbnRzIGludG8gdGhlIGZpbGUKLSAgICBfd3JpdGVSZXNvdXJjZUNvbnRlbnRzKG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQVRFX0ZPUk1BVF9aT05FX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIC8vIHRoaXMgaXMgdGhlIGxhc3QgcmVzb3VyY2UgdG8gd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50KTsKLQotICAgIG91dHB1dC53cml0ZSgifSk7Iik7Ci0KLSAgICBpZiAocHJldHR5UHJpbnQpCi0gICAgewotICAgICAgb3V0cHV0LndyaXRlKCdcbicpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfd3JpdGVSZXNvdXJjZUNvbnRlbnRzKAotICAgIFdyaXRlciAgICAgIG91dHB1dCwKLSAgICBTdHJpbmcgICAgICBiYXNlTmFtZSwKLSAgICBFbnVtZXJhdGlvbiBrZXlzLAotICAgIExvY2FsZSAgICAgIHRhcmdldExvY2FsZSwKLSAgICBib29sZWFuICAgICBoYXNNb3JlUmVzb3VyY2VzLAotICAgIGJvb2xlYW4gICAgIHByZXR0eVByaW50Ci0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlQnVuZGxlIGVsZW1lbnRzRGF0YSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShiYXNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRMb2NhbGUpOwotCi0gICAgICB3aGlsZShrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgY3VycktleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgIE9iamVjdCBkYXRhID0gbnVsbDsKLQotICAgICAgICBpZigiQ3VycmVuY3lFbGVtZW50cyIuZXF1YWxzKGN1cnJLZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgZGF0YSA9IF9nZXRDdXJyZW5jeURhdGEodGFyZ2V0TG9jYWxlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkYXRhID0gX2dldEVsZW1lbnREYXRhKGN1cnJLZXksIGVsZW1lbnRzRGF0YSwgdGFyZ2V0TG9jYWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gd3JvdGVFbGVtZW50ID0gX3dyaXRlUmVzb3VyY2VFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNNb3JlUmVzb3VyY2VzIHx8IGtleXMuaGFzTW9yZUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludCk7Ci0KLSAgICAgICAgaWYgKHdyb3RlRWxlbWVudCAmJiBwcmV0dHlQcmludCkKLSAgICAgICAgewotICAgICAgICAgIG91dHB1dC53cml0ZSgnXG4nKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIE9iamVjdCBfZ2V0Q3VycmVuY3lEYXRhKAotICAgIExvY2FsZSB0YXJnZXRMb2NhbGUpCi0gIHsKLSAgICBEZWNpbWFsRm9ybWF0IGRmID0gKERlY2ltYWxGb3JtYXQpIE51bWJlckZvcm1hdC5nZXRDdXJyZW5jeUluc3RhbmNlKHRhcmdldExvY2FsZSk7Ci0gICAgRGVjaW1hbEZvcm1hdFN5bWJvbHMgZGVjaW1hbEZvcm1hdFN5bWJvbHMgPSBkZi5nZXREZWNpbWFsRm9ybWF0U3ltYm9scygpOwotICAgIE9iamVjdFtdIGN1cnJlbmN5RGF0YSA9IG5ldyBPYmplY3RbNl07Ci0gICAgY3VycmVuY3lEYXRhWzBdID0gZGVjaW1hbEZvcm1hdFN5bWJvbHMuZ2V0Q3VycmVuY3lTeW1ib2woKTsgCi0gICAgY3VycmVuY3lEYXRhWzFdID0gZGVjaW1hbEZvcm1hdFN5bWJvbHMuZ2V0Q3VycmVuY3koKS5nZXRDdXJyZW5jeUNvZGUoKTsKLSAgICBjdXJyZW5jeURhdGFbMl0gPSBkZi5nZXRQb3NpdGl2ZVByZWZpeCgpOwotICAgIGN1cnJlbmN5RGF0YVszXSA9IGRmLmdldFBvc2l0aXZlU3VmZml4KCk7Ci0gICAgY3VycmVuY3lEYXRhWzRdID0gZGYuZ2V0TmVnYXRpdmVQcmVmaXgoKTsKLSAgICBjdXJyZW5jeURhdGFbNV0gPSBkZi5nZXROZWdhdGl2ZVN1ZmZpeCgpOwotCi0gICAgcmV0dXJuIGN1cnJlbmN5RGF0YTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIE9iamVjdCBfZ2V0RWxlbWVudERhdGEoCi0gICAgU3RyaW5nIGN1cnJLZXksCi0gICAgUmVzb3VyY2VCdW5kbGUgZWxlbWVudHNEYXRhLAotICAgIExvY2FsZSB0YXJnZXRMb2NhbGUKLSAgICkKLSAgewotICAgIHJldHVybiBlbGVtZW50c0RhdGEuZ2V0T2JqZWN0KGN1cnJLZXkpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfd3JpdGVSZXNvdXJjZUVsZW1lbnQoCi0gICAgV3JpdGVyICBvdXRwdXQsCi0gICAgU3RyaW5nICBrZXksCi0gICAgT2JqZWN0ICB2YWx1ZSwKLSAgICBib29sZWFuIG5vdExhc3QsCi0gICAgYm9vbGVhbiBwcmV0dHlQcmludAotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoa2V5ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc3RhcnQgd3JpdGluZyBlbGVtZW50LCB1c2luZyBrZXkgYXMgdGhlIHByb3BlcnR5IG5hbWUKLSAgICAgIG91dHB1dC53cml0ZShrZXkpOwotICAgICAgb3V0cHV0LndyaXRlKCc6Jyk7Ci0gICAgfQotCi0gICAgT2JqZWN0W10gdmFsdWVzID0gbnVsbDsKLSAgICBpbnQgdmFsdWVDb3VudCA9IDA7Ci0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkKLSAgICB7Ci0gICAgICB2YWx1ZXMgPSAoT2JqZWN0W10pdmFsdWU7Ci0KLSAgICAgIHZhbHVlQ291bnQgPSB2YWx1ZXMubGVuZ3RoOwotCi0gICAgICBpZiAodmFsdWVDb3VudCA9PSAwKQotICAgICAgewotICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZUNvdW50ICE9IDApCi0gICAgewotICAgICAgLy8gb3V0cHV0LndyaXRlKCJuZXcgQXJyYXkoIik7Ci0gICAgICBvdXRwdXQud3JpdGUoJ1snKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspCi0gICAgICB7Ci0gICAgICAgIF93cml0ZVJlc291cmNlRWxlbWVudChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA8IHZhbHVlQ291bnQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnQpOwotICAgICAgfQotCi0gICAgICAvL291dHB1dC53cml0ZSgnKScpOwotICAgICAgb3V0cHV0LndyaXRlKCddJyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXRwdXQud3JpdGUoJ1wiJyk7Ci0gICAgICBfd3JpdGVFc2NhcGVkU3RyaW5nKG91dHB1dCwgdmFsdWUudG9TdHJpbmcoKSwgZmFsc2UpOwotICAgICAgb3V0cHV0LndyaXRlKCdcIicpOwotICAgIH0KLQotICAgIGlmIChub3RMYXN0KQotICAgIHsKLSAgICAgIG91dHB1dC53cml0ZSgnLCcpOwotCi0gICAgICBpZiAocHJldHR5UHJpbnQpCi0gICAgICB7Ci0gICAgICAgIG91dHB1dC53cml0ZSgnICcpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHdlIHdyb3RlIHNvbWUgb3VwdXQKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgX3dyaXRlSmF2YUJ1bmRsZUVsZW1lbnQoCi0gICAgV3JpdGVyICBvdXRwdXQsCi0gICAgU3RyaW5nICBrZXksCi0gICAgT2JqZWN0ICB2YWx1ZSwKLSAgICBib29sZWFuIHdhc1ByZXZpb3VzCi0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dHB1dC53cml0ZSgiICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgIgotICAgICAgICAgICAgICAgICArIF9nZXRLZXlBcnJheU5hbWUoa2V5KQotICAgICAgICAgICAgICAgICArICJbXSIpOwotICAgIE9iamVjdFtdIHZhbHVlcyA9IG51bGw7Ci0gICAgaW50IHZhbHVlQ291bnQgPSAwOwotICAgIGJvb2xlYW4gZG9uZU9uZSA9IGZhbHNlOwotCi0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0W10pCi0gICAgewotICAgICAgdmFsdWVzID0gKE9iamVjdFtdKSB2YWx1ZTsKLQotICAgICAgdmFsdWVDb3VudCA9IHZhbHVlcy5sZW5ndGg7Ci0KLSAgICAgIGlmICh2YWx1ZUNvdW50IDw9IDApCi0gICAgICB7Ci0gICAgICAgIHZhbHVlcyA9IF9FTVBUWV9WQUxVRVM7Ci0gICAgICAgIHZhbHVlQ291bnQgPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZUNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBvdXRwdXQud3JpdGUoIiA9IFxuICB7XG4iKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKQotICAgICAgewotICAgICAgICBvdXRwdXQud3JpdGUoKGRvbmVPbmUgPyAiLCBcbiIgOiAiIikgKyAiICAgIFwiIik7Ci0gICAgICAgIF93cml0ZUVzY2FwZWRTdHJpbmcob3V0cHV0LCB2YWx1ZXNbaV0udG9TdHJpbmcoKSwgdHJ1ZSk7Ci0gICAgICAgIG91dHB1dC53cml0ZSgiXCIiKTsKLSAgICAgICAgZG9uZU9uZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBvdXRwdXQud3JpdGUoIlxuICB9O1xuXG4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dHB1dC53cml0ZSgiID0gbnVsbCIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgX3dyaXRlRXNjYXBlZFN0cmluZygKLSAgICBXcml0ZXIgb3V0cHV0LAotICAgIFN0cmluZyB2YWx1ZSwKLSAgICBib29sZWFuIGlzSmF2YQotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgY3VyckNoYXIgPSB2YWx1ZS5jaGFyQXQoaSk7Ci0KLSAgICAgIGlmIChjdXJyQ2hhciA+IDI1NSkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0LndyaXRlKCJcXHUiKTsKLSAgICAgICAgb3V0cHV0LndyaXRlKF9nZXRIZXhTdHJpbmcoY3VyckNoYXIsIDQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzSmF2YSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoY3VyckNoYXIgPiAzMSkKLSAgICAgICAgICAgICAgJiYgKGN1cnJDaGFyIDwgMTI4KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VyckNoYXIgPT0gJ1wiJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCJcXFwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG91dHB1dC53cml0ZShjdXJyQ2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoIlxcdSIpOwotICAgICAgICAgICAgb3V0cHV0LndyaXRlKF9nZXRIZXhTdHJpbmcoY3VyckNoYXIsIDQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd3JpdGUgYXNjaWkgcHJpbnRhYmxlIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgdGhlIGRvdWJsZSBxdW90ZSwKLSAgICAgICAgICAvLyB3aGljaCBuZWVkcyB0byBiZSBlc2NhcGVkIGJlY2F1c2Ugd2UgYXJlIGFscmVhZHkgaW4gYSBTdHJpbmcuCi0gICAgICAgICAgaWYgKChjdXJyQ2hhciA+IDMxKSAgICAmJgotICAgICAgICAgICAgICAoY3VyckNoYXIgPCAxMjgpICAgJiYKLSAgICAgICAgICAgICAgKGN1cnJDaGFyICE9ICdcIicpICYmCi0gICAgICAgICAgICAgIChjdXJyQ2hhciAhPSAnXCcnKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoY3VyckNoYXIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlKCJcXHgiKTsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZShfZ2V0SGV4U3RyaW5nKGN1cnJDaGFyLCAyKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2dldEhleFN0cmluZygKLSAgICBpbnQgbnVtYmVyLAotICAgIGludCBtaW5EaWdpdHMKLSAgICApCi0gIHsKLSAgICBTdHJpbmcgaGV4U3RyaW5nID0gSW50ZWdlci50b0hleFN0cmluZyhudW1iZXIpOwotCi0gICAgaW50IGhleExlbmd0aCA9IGhleFN0cmluZy5sZW5ndGgoKTsKLQotICAgIGludCB6ZXJvUGFkZGluZyA9IG1pbkRpZ2l0cyAtIGhleExlbmd0aDsKLQotICAgIGlmICh6ZXJvUGFkZGluZyA+IDApCi0gICAgewotICAgICAgU3RyaW5nIHBhZGRlZFN0cmluZyA9ICIwIjsKLQotICAgICAgd2hpbGUgKHplcm9QYWRkaW5nID4gMSkKLSAgICAgIHsKLSAgICAgICAgcGFkZGVkU3RyaW5nICs9ICIwIjsKLSAgICAgICAgemVyb1BhZGRpbmctLTsKLSAgICAgIH0KLQotICAgICAgaGV4U3RyaW5nID0gcGFkZGVkU3RyaW5nICsgaGV4U3RyaW5nOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHplcm9QYWRkaW5nIDwgMCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBoZXhTdHJpbmc7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2dldEtleUFycmF5TmFtZShTdHJpbmcga2V5KQotICB7Ci0gICAgcmV0dXJuICJfYXJyYXkiICsga2V5OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9nZXRGaWxlTmFtZSgKLSAgICBMb2NhbGUgbG9jYWxlLAotICAgIFN0cmluZyB2ZXJzaW9uLAotICAgIGJvb2xlYW4gZ2VuZXJhdGVCdW5kbGVCYXNlT25seQotICAgICkKLSAgewotCi0gICAgaWYgKGdlbmVyYXRlQnVuZGxlQmFzZU9ubHkpCi0gICAgewotICAgICAgcmV0dXJuICJMb2NhbGVFbGVtZW50cyI7Ci0gICAgfQotCi0gICAgaWYgKHZlcnNpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gIkxvY2FsZUVsZW1lbnRzXyIgKyBsb2NhbGU7Ci0gICAgfQotICAgIHJldHVybiAiTG9jYWxlRWxlbWVudHNfIiArIGxvY2FsZSArIHZlcnNpb247Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2dldExvY2FsZVN1ZmZpeCgKLSAgICBMb2NhbGUgbG9jYWxlCi0gICAgKQotICB7Ci0gICAgU3RyaW5nIGxvY2FsZVN0cmluZyA9ICBsb2NhbGUudG9TdHJpbmcoKTsKLQotICAgIHJldHVybiBsb2NhbGVTdHJpbmcuc3Vic3RyaW5nKGxvY2FsZVN0cmluZy5pbmRleE9mKCdfJykpOwotICB9Ci0KLSAgLy8KLSAgLy8gQXJyYXkgb2YgRGF0ZUZvcm1hdFpvbmVEYXRhIGtleSBuYW1lcyB0byByZXRyaWV2ZS4KLSAgLy8gT25seSBrZXlzIGZyb20gdGhpcyBsaXN0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIGxvY2FsZSBpbmZvcm1hdGlvbgotICAvLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMT0NBTEVfRUxFTUVOVFNfR0VUX0tFWVMgPSAKLSAgewotICAgICJNb250aE5hbWVzIiwKLSAgICAiTW9udGhBYmJyZXZpYXRpb25zIiwKLSAgICAiRGF5TmFtZXMiLAotICAgICJEYXlBYmJyZXZpYXRpb25zIiwKLSAgICAiQW1QbU1hcmtlcnMiLAotICAgICJFcmFzIiwKLSAgICAiRGF0ZVRpbWVQYXR0ZXJucyIsCi0gICAgIkRhdGVUaW1lRWxlbWVudHMiLAotICAgICJOdW1iZXJFbGVtZW50cyIsCi0gICAgIkN1cnJlbmN5RWxlbWVudHMiLAotICB9OwotCi0gIC8vCi0gIC8vIEFycmF5IG9mIERhdGVGb3JtYXRab25lRGF0YSBrZXkgbmFtZXMgdG8gcmV0cmlldmUuCi0gIC8vIE9ubHkga2V5cyBmcm9tIHRoaXMgbGlzdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBsb2NhbGUgaW5mb3JtYXRpb24KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTE9DQUxFX0VMRU1FTlRTX01BUFBJTkdTID0gCi0gIHsKLSAgICAiTW9udGhOYW1lcyIsICJnZXRNb250aHMiLAotICAgICJNb250aEFiYnJldmlhdGlvbnMiLCAiZ2V0U2hvcnRNb250aHMiLAotICAgICJEYXlOYW1lcyIsICJnZXRXZWVrZGF5cyIsCi0gICAgIkRheUFiYnJldmlhdGlvbnMiLCAiZ2V0U2hvcnRXZWVrZGF5cyIsCi0gICAgIkFtUG1NYXJrZXJzIiwgImdldEFtUG1TdHJpbmdzIiwKLSAgICAiRXJhcyIsICJnZXRFcmFzIiwKLSAgICAiRGF0ZVRpbWVQYXR0ZXJucyIsIG51bGwsCi0gICAgIkRhdGVUaW1lRWxlbWVudHMiLCBudWxsLAotICAgICJOdW1iZXJFbGVtZW50cyIsIG51bGwKLSAgfTsKLQotICAvLwotICAvLyBBcnJheSBvZiBMb2NhbGVFbGVtZW50cyBrZXkgbmFtZXMgdG8gcmV0cmlldmUuCi0gIC8vIE9ubHkga2V5cyBmcm9tIHRoaXMgbGlzdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBsb2NhbGUgaW5mb3JtYXRpb24KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFURV9GT1JNQVRfWk9ORV9HRVRfS0VZUyA9IHt9OwotCi0gIC8vIEoyU0UgMS4zOgotICAvLyBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX1JFU09VUkNFU19QQUNLQUdFID0gImphdmEudGV4dC5yZXNvdXJjZXMiOwotCi0gIC8vIEoyU0UgMS40OgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1JFU09VUkNFU19QQUNLQUdFID0gInN1bi50ZXh0LnJlc291cmNlcyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9EQVRFX0ZPUk1BVF9aT05FX1BBVEggPQotICAgICAgICAgICAgICAgICAgICAgICAgICBfUkVTT1VSQ0VTX1BBQ0tBR0UgKyAiLkRhdGVGb3JtYXRab25lRGF0YSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9MT0NBTEVfRUxFTUVOVFNfUEFUSCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9SRVNPVVJDRVNfUEFDS0FHRSArICIuTG9jYWxlRWxlbWVudHMiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfREVGQVVMVF9MT0NBVElPTl9QQVRIID0KLSAgICAgICAgICAib3JnXFxhcGFjaGVcXG15ZmFjZXNcXHRyaW5pZGFkaW50ZXJuYWxcXHVpXFxqc0xpYnNcXHJlc291cmNlc1xcIi5yZXBsYWNlKCdcXCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotICAvLyBNaW1pY2tpbmcgdG8gYmUgaW4gYXBpIHBhdGguIEluIHRoZSB0cmluaWRhZC1mYWNlcyBpbXBsIHNpZGUgd2UgaGF2ZQotICAvLyB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuIFRoZXJlIGlzIGlkZW50aWNhbCBkaXJlY3Rvcnkgc3R1cmN0dXJlCi0gIC8vIGluIHRyaW5pZGFkLWZhY2VzIGFwaSBzaWRlLgotICAvLyBPbmx5IF9UUklOSURBRF9MT0NBTEVfRUxFTUVOVCBiYXNlIGZpbGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgYXBpIHNpZGUsCi0gIC8vIHdoaWxlIGFsbCB0aGUgdmFyaWFudHMgd2lsbCBiZSBpbiBpbXBsIHNpZGUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKLSAgLy8gZGVmaW5lZCBiZWxvdy4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9UUklOSURBRF9MT0NBTEVfRUxFTUVOVFNfUEFDS0FHRSA9Ci0gICAgIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5yZXNvdXJjZSI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0RFRkFVTFRfQlVORExFX0xPQ0FUSU9OX1BBVEggPQotICAgIChfVFJJTklEQURfTE9DQUxFX0VMRU1FTlRTX1BBQ0tBR0UucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikKLSAgICAgKyBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVFJJTklEQURfTE9DQUxFX0VMRU1FTlRTX1BBVEggPQotICAgIF9UUklOSURBRF9MT0NBTEVfRUxFTUVOVFNfUEFDS0FHRSArICIuTG9jYWxlRWxlbWVudHMiOwotCi0gIC8vIGJ1ZmZlciBzaXplIG9mIHRoZSBCdWZmZXJlZFdyaXRlciB0byB3aGljaCBvdXRwdXQgaXMgd3JpdHRlbgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX0RFRkFVTFRfQlVGRkVSX1NJWkUgPSAxIDw8IDE0OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfTE9DQUxFX0xJU1RfUEFUSCA9Ci0gICAgICAgICAgIm9yZ1xcYXBhY2hlXFxteWZhY2VzXFx0cmluaWRhZGludGVybmFsXFx1aVxcbGFmXFxiYXNlXFx4aHRtbFxcTG9jYWxlTGlzdC5qYXZhIi5yZXBsYWNlKCdcXCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0VNUFRZX1ZBTFVFU1tdID0geyAiIiB9OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfTE9DQUxFX0xJU1RfQ09ERV9TVEFSVCA9Ci0iLypcbiIgKwotIioqXG4iICsKLSIqKjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XG4iICsKLSIqL1xuIiArCi0icGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC51aS5sYWYuYmFzZS54aHRtbDtcbiIgKwotIlxuIiArCi0iaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7XG4iICsKLSJcbiIgKwotImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKwotIlxuIiArCi0iLypcbiIgKwotIiAqIExpc3Qgb2Ygc3VwcG9ydGVkIGxvY2FsZXMuICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAtIGRvIG5vdCBtb2RpZnkhXG4iICsKLSIgKi9cbiIgKwotInB1YmxpYyBjbGFzcyBMb2NhbGVMaXN0XG4iICsKLSJ7XG4iICsKLSIgIC8qXG4iICsKLSIgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGxvY2FsZXMuXG4iICsKLSIgICAqL1xuIiArCi0iICBzdGF0aWMgcHVibGljIEhhc2hNYXA8TG9jYWxlLCBMb2NhbGU+IGdldFN1cHBvcnRlZExvY2FsZXMoKVxuIiArCi0iICB7XG4iICsKLSIgICAgcmV0dXJuIF9zTG9jYWxlTWFwcGVyO1xuIiArCi0iICB9XG4iICsKLSIgIFxuIiArCi0iICBwcml2YXRlIExvY2FsZUxpc3QoKVxuIiArCi0iICB7XG4iICsKLSIgIH1cbiIgKwotIlxuIiArCi0iICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2NhbGVbXSBfc0xvY2FsZXMgPSBuZXcgTG9jYWxlW11cbiIgKwotIiAge1xuIjsKLQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfTE9DQUxFX0xJU1RfQ09ERV9FTkQgPQotIiAgfTtcbiIgKwotIlxuIiArCi0iICBzdGF0aWMgcHJpdmF0ZSBIYXNoTWFwPExvY2FsZSwgTG9jYWxlPiBfc0xvY2FsZU1hcHBlcjtcbiIgKwotIlxuIiArCi0iICBzdGF0aWNcbiIgKwotIiAge1xuIiArCi0iICAgIF9zTG9jYWxlTWFwcGVyID0gbmV3IEhhc2hNYXA8TG9jYWxlLCBMb2NhbGU+KCk7XG4iICsKLSIgICAgZm9yKExvY2FsZSBsb2NhbGUgOiBfc0xvY2FsZXMpXG4iICsKLSIgICAge1xuIiArCi0iICAgICAgX3NMb2NhbGVNYXBwZXIucHV0KGxvY2FsZSwgbG9jYWxlKTtcbiIgKwotIiAgICB9XG4iICsKLSIgIH1cbiIgKwotIn1cbiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9MT0NBTEVfSkFWQV9DT0RFX1NUQVJUID0KLSAgICAiLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIVxuIgotICAgICsgIi8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiIKLSAgICArICIvLyBFZGl0IEpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IgaW5zdGVhZC5cbi8vXG4iCi0gICAgKyAicGFja2FnZSAiCi0gICAgKyBfVFJJTklEQURfTE9DQUxFX0VMRU1FTlRTX1BBQ0tBR0UKLSAgICArICI7XG5cbiIKLSAgICArICJpbXBvcnQgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZTtcbiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9KQVZBU0NSSVBUX0VYVEVOU0lPTiA9ICIuanMiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0pBVkFfRVhURU5TSU9OID0gIi5qYXZhIjsKLSAKLSAgLy9JbnRyb2R1Y2VkIHRvIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiBiYWxpLXNoYXJlIGluIHRoZSBhcGkgc2lkZS4KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJyYXlFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uCi0gIHsKLSAgICBwdWJsaWMgQXJyYXlFbnVtZXJhdGlvbihPYmplY3RbXSBhcnJheSkKLSAgICB7Ci0gICAgICBfb2JqZWN0cyA9IChhcnJheSA9PSBudWxsKT8gX0VNUFRZX0FSUkFZIDogYXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX2N1cnJlbnRJbmRleCA8IF9vYmplY3RzLmxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gX29iamVjdHNbX2N1cnJlbnRJbmRleCsrXTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdFtdIF9vYmplY3RzOwotCi0gICAgcHJpdmF0ZSBpbnQgX2N1cnJlbnRJbmRleDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIF9FTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vdWl4dG9vbHMvVmVyc2lvblV0aWxzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL3VpeHRvb2xzL1ZlcnNpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjk4MDFiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vdWl4dG9vbHMvVmVyc2lvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uaTE4bi51aXh0b29sczsKLQotcHVibGljIGNsYXNzIFZlcnNpb25VdGlscwotewotICAvKioKLSAgICogTm9ybWFsaXplIGEgdmVyc2lvbiBudW1iZXIgZm9yIHVzZSBhcyBhIGZpbGUgc3VmZml4LgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgbm9ybWFsaXplVmVyc2lvblN1ZmZpeChTdHJpbmcgdmVyc2lvbikKLSAgewotICAgIGlmICh2ZXJzaW9uID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZlcnNpb24ucmVwbGFjZSgnLicsICdfJyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9MSUNFTlNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3NWVhOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgTElDRU5TRVMgRk9SIElOQ0xVREVEIERFUEVOREVOQ0lFUwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIFRyaW5pZGFkIFBsdWdpbnMgcHJvamVjdCBpcyByZWxlYXNlZCB1bmRlciB0aGUKLWxpY2Vuc2UgYWJvdmUuIEFkZGl0aW9uYWxseSwgdGhlIFRyaW5pZGFkIFBsdWdpbnMgYmluYXJ5IGRpc3RyaWJ1dGlvbgotaW5jbHVkZXMgYSBudW1iZXIgb2YgdGhpcmQtcGFydHkgZmlsZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4KLW9yZGVyIHRvIHRoZSBzb2Z0d2FyZSB0byBmdW5jdGlvbi4gVW5sZXNzIG5vdGVkIGJlbG93LCB0aGVzZSBqYXJzCi1hbmQgcmVzb3VyY2UgZmlsZXMgYXJlIGFsc28gcmVsZWFzZWQgdW5kZXIgdGhlIEFTRiBsaWNlbnNlIGFib3ZlLgotCi1UaGUgZXhjZXB0aW9ucyBhcmUgYXMgZm9sbG93czoKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIGphdmFjYyBpbmNsdWRlZCBpbiB0aGUgbWF2ZW4tamF2YWNjLXBsdWdpbiwgdGFrZW4gZnJvbToKLSAgaHR0cDovL2phdmFjYy5kZXYuamF2YS5uZXQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLUNvcHlyaWdodCAoYykgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCAgUmlnaHRzIFJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKLWFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotLVJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotLVJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKLXRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIAotb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG9yIHRoZSBuYW1lcyBvZiBjb250cmlidXRvcnMgbWF5IAotYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMsIiB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuIEFMTCBFWFBSRVNTIE9SIElNUExJRUQgQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZIElNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgSEVSRUJZIEVYQ0xVREVELiBTVU4gTUlEUk9TWVNURU1TLCBJTkMuICgiU1VOIikgQU5EIElUUyBMSUNFTlNPUlMgU0hBTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMgU1VGRkVSRUQgQlkgTElDRU5TRUUgQVMgQSBSRVNVTFQgT0YgVVNJTkcsIE1PRElGWUlORyBPUiBESVNUUklCVVRJTkcgVEhJUyBTT0ZUV0FSRSBPUiBJVFMgREVSSVZBVElWRVMuIElOIE5PIEVWRU5UIFdJTEwgU1VOIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiBBTlkgTE9TVCBSRVZFTlVFLCBQUk9GSVQgT1IgREFUQSwgT1IgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwgT1IgUFVOSVRJVkUgREFNQUdFUywgSE9XRVZFUiBDQVVTRUQgQU5EIFJFR0FSRExFU1MgT0YgVEhFIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIFNVTiBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLVlvdSBhY2tub3dsZWRnZSB0aGF0ICB0aGlzIHNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCwgbGljZW5zZWQgb3IgaW50ZW5kZWQgZm9yIHVzZSBpbiB0aGUgZGVzaWduLCBjb25zdHJ1Y3Rpb24sIG9wZXJhdGlvbiBvciBtYWludGVuYW5jZSBvZiBhbnkgbnVjbGVhciBmYWNpbGl0eS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGMxMjZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotVHJpbmlkYWQgUGx1Z2lucyBpcyBidW5kbGVkIHdpdGggdGhlIGJpbmFyaWVzIGZyb20gdGhlIGphdmFjYyBwcm9qZWN0LCBieQotU3VuIE1pY3Jvc3lzdGVtcyBhbmQgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC4gVGhlIHNvdXJjZSBjb2RlIGlzCi1hdmFpbGFibGUgYXQ6IGh0dHBzOi8vamF2YWNjLmRldi5qYXZhLm5ldC9zb3VyY2UvYnJvd3NlL2phdmFjYy8KLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGVlMzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0JICAgCi0tLT4KLTxwcm9qZWN0Ci0gIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtamF2YWNjLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEphdmFjYyBQbHVnaW48L25hbWU+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm5ldC5qYXZhLmRldi5qYXZhY2M8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qYXZhY2M8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YWNjL0phdmFDQ01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YWNjL0phdmFDQ01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzYWViMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFjYy9KYXZhQ0NNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFjYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci51dGlsLnNjYW4uSW5jbHVzaW9uU2NhbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5Tb3VyY2VJbmNsdXNpb25TY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLlN0YWxlU291cmNlU2Nhbm5lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5tYXBwaW5nLlN1ZmZpeE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLQotCi0vKioKLSAqIEBnb2FsIGdlbmVyYXRlCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggcGFyc2UgYSBKSiBmaWxlIGFuZCB0cmFuc2Zvcm0gaXQgdG8gSmF2YSBTb3VyY2UgRmlsZXMuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ0NNb2pvCi0gIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249MQotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgaW50IGxvb2tBaGVhZDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPTIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGludCBjaG9pY2VBbWJpZ3VpdHlDaGVjazsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPTEKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGludCBvdGhlckFtYmlndWl0eUNoZWNrOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InRydWUiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z1BhcnNlcjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZGVidWdMb29rQWhlYWQ7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGRlYnVnVG9rZW5NYW5hZ2VyOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InRydWUiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG9wdGltaXplVG9rZW5NYW5hZ2VyOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InRydWUiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGVycm9yUmVwb3J0aW5nOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBqYXZhVW5pY29kZUVzY2FwZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdW5pY29kZUlucHV0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVDYXNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb21tb25Ub2tlbkFjdGlvbjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdXNlclRva2VuTWFuYWdlcjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdXNlckNoYXJTdHJlYW07Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYnVpbGRQYXJzZXI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYnVpbGRUb2tlbk1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc2FuaXR5Q2hlY2s7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlTGFDaGVjazsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2FjaGVUb2tlbnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4ga2VlcExpbmVDb2x1bW47Ci0KLSAgLyoqCi0gICAqIERpcmVjdG9yeSB3aGVyZSB0aGUgSkogZmlsZShzKSBhcmUgbG9jYXRlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9qYXZhY2MiCi0gICAqLwotICBwcml2YXRlIEZpbGUgc291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBQYXRoIHVuZGVyIHNvdXJjZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIEpKIGZpbGUocykgYXJlIGxvY2F0ZWQuCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iIgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgc291cmNlUGF0aDsKLQotICAvKioKLSAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBvdXRwdXQgSmF2YSBGaWxlcyB3aWxsIGJlIGxvY2F0ZWQuCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9qYXZhIgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKLQotICAvKioKLSAgICogUGF0aCB1bmRlciBvdXRwdXQgZGlyZWN0b3J5IHdoZXJlIHRoZSBvdXRwdXQgSmF2YSBGaWxlcyB3aWxsIGJlIGxvY2F0ZWQuCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iIgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0UGF0aDsKLQotICAvKioKLSAgICogdGhlIGRpcmVjdG9yeSB0byBzdG9yZSB0aGUgcHJvY2Vzc2VkIC5qaiBmaWxlcwotICAgKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWphdmFjYy1wbHVnaW4vc3JjL21haW4vY29uZiIKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0aW1lc3RhbXBEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIFRoZSBncmFudWxhcml0eSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlIGxhc3QgbW9kaWZpY2F0aW9uCi0gICAqIGRhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciBhIHNvdXJjZSBuZWVkcyByZWNvbXBpbGF0aW9uCi0gICAqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtsYXN0TW9kR3JhbnVsYXJpdHlNc30iIGRlZmF1bHQtdmFsdWU9IjAiCi0gICAqLwotICBwcml2YXRlIGludCBzdGFsZU1pbGxpczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj1mYWxzZQotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBkb05vdEdlbmVyYXRlVG9rZW5GaWxlOwotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIG91dERpciA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwgb3V0cHV0UGF0aCk7Ci0KLSAgICBpZiAoIW91dERpci5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBvdXREaXIubWtkaXJzKCk7Ci0gICAgfQotCi0gICAgaWYgKCF0aW1lc3RhbXBEaXJlY3RvcnkuZXhpc3RzKCkpCi0gICAgewotICAgICAgdGltZXN0YW1wRGlyZWN0b3J5Lm1rZGlycygpOwotICAgIH0KLQotICAgIFNldCBzdGFsZUdyYW1tYXJzID0gY29tcHV0ZVN0YWxlR3JhbW1hcnMoKTsKLQotICAgIGlmIChzdGFsZUdyYW1tYXJzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIHByb2Nlc3MgLSBhbGwgZ3JhbW1hcnMgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3Qob3V0RGlyLmdldFBhdGgoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpID0gc3RhbGVHcmFtbWFycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEZpbGUgamF2YWNjRmlsZSA9IChGaWxlKSBpLm5leHQoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBvcmcuamF2YWNjLnBhcnNlci5NYWluLm1haW5Qcm9ncmFtKGdlbmVyYXRlSmF2YUNDQXJndW1lbnRMaXN0KGphdmFjY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotICAgICAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShqYXZhY2NGaWxlLCB0aW1lc3RhbXBEaXJlY3RvcnkpOwotICAgICAgICBpZiAoZG9Ob3RHZW5lcmF0ZVRva2VuRmlsZSA9PSB0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZSB0b2tlbkZpbGUgID0gbmV3IEZpbGUob3V0RGlyLCAiVG9rZW4uamF2YSIpOwotICAgICAgICAgIEZpbGVVdGlscy5mb3JjZURlbGV0ZSh0b2tlbkZpbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJKYXZhQ0MgZXhlY3V0aW9uIGZhaWxlZCIsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChvdXRwdXREaXJlY3RvcnkuZ2V0UGF0aCgpKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgU3RyaW5nW10gZ2VuZXJhdGVKYXZhQ0NBcmd1bWVudExpc3QoU3RyaW5nIGphdmFjY0lucHV0KQotICB7Ci0KLSAgICBGaWxlIG91dERpciA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwgb3V0cHV0UGF0aCk7Ci0KLSAgICBBcnJheUxpc3QgYXJnc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBhcmdzTGlzdC5hZGQoIi1MT09LQUhFQUQ9IiArIGxvb2tBaGVhZCk7Ci0gICAgYXJnc0xpc3QuYWRkKCItQ0hPSUNFX0FNQklHVUlUWV9DSEVDSz0iICsgY2hvaWNlQW1iaWd1aXR5Q2hlY2spOwotICAgIGFyZ3NMaXN0LmFkZCgiLU9USEVSX0FNQklHVUlUWV9DSEVDSz0iICsgb3RoZXJBbWJpZ3VpdHlDaGVjayk7Ci0gICAgYXJnc0xpc3QuYWRkKCItU1RBVElDPSIgKyBpc1N0YXRpYyk7Ci0gICAgYXJnc0xpc3QuYWRkKCItREVCVUdfUEFSU0VSPSIgKyBkZWJ1Z1BhcnNlcik7Ci0gICAgYXJnc0xpc3QuYWRkKCItREVCVUdfTE9PS0FIRUFEPSIgKyBkZWJ1Z0xvb2tBaGVhZCk7Ci0gICAgYXJnc0xpc3QuYWRkKCItREVCVUdfVE9LRU5fTUFOQUdFUj0iICsgZGVidWdUb2tlbk1hbmFnZXIpOwotICAgIGFyZ3NMaXN0LmFkZCgiLU9QVElNSVpFX1RPS0VOX01BTkFHRVI9IiArIG9wdGltaXplVG9rZW5NYW5hZ2VyKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1FUlJPUl9SRVBPUlRJTkc9IiArIGVycm9yUmVwb3J0aW5nKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1KQVZBX1VOSUNPREVfRVNDQVBFPSIgKyBqYXZhVW5pY29kZUVzY2FwZSk7Ci0gICAgYXJnc0xpc3QuYWRkKCItVU5JQ09ERV9JTlBVVD0iICsgdW5pY29kZUlucHV0KTsKLSAgICBhcmdzTGlzdC5hZGQoIi1JR05PUkVfQ0FTRT0iICsgaWdub3JlQ2FzZSk7Ci0gICAgYXJnc0xpc3QuYWRkKCItQ09NTU9OX1RPS0VOX0FDVElPTj0iICsgY29tbW9uVG9rZW5BY3Rpb24pOwotICAgIGFyZ3NMaXN0LmFkZCgiLVVTRVJfVE9LRU5fTUFOQUdFUj0iICsgdXNlclRva2VuTWFuYWdlcik7Ci0gICAgYXJnc0xpc3QuYWRkKCItVVNFUl9DSEFSX1NUUkVBTT0iICsgdXNlckNoYXJTdHJlYW0pOwotICAgIGFyZ3NMaXN0LmFkZCgiLUJVSUxEX1BBUlNFUj0iICsgYnVpbGRQYXJzZXIpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUJVSUxEX1RPS0VOX01BTkFHRVI9IiArIGJ1aWxkVG9rZW5NYW5hZ2VyKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1TQU5JVFlfQ0hFQ0s9IiArIHNhbml0eUNoZWNrKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1GT1JDRV9MQV9DSEVDSz0iICsgZm9yY2VMYUNoZWNrKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1DQUNIRV9UT0tFTlM9IiArIGNhY2hlVG9rZW5zKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1LRUVQX0xJTkVfQ09MVU1OPSIgKyBrZWVwTGluZUNvbHVtbik7Ci0gICAgYXJnc0xpc3QuYWRkKCItT1VUUFVUX0RJUkVDVE9SWToiICsgb3V0RGlyLmdldFBhdGgoKSk7Ci0gICAgYXJnc0xpc3QuYWRkKGphdmFjY0lucHV0KTsKLQotICAgIGdldExvZygpLmRlYnVnKCJhcmdzbGlzdDogIiArIGFyZ3NMaXN0LnRvU3RyaW5nKCkpOwotCi0gICAgcmV0dXJuIChTdHJpbmdbXSkgYXJnc0xpc3QudG9BcnJheShuZXcgU3RyaW5nW2FyZ3NMaXN0LnNpemUoKV0pOwotICB9Ci0KLSAgcHJpdmF0ZSBTZXQgY29tcHV0ZVN0YWxlR3JhbW1hcnMoKQotICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBTdWZmaXhNYXBwaW5nIG1hcHBpbmcgPSBuZXcgU3VmZml4TWFwcGluZygiLmpqIiwgIi5qaiIpOwotICAgIFN1ZmZpeE1hcHBpbmcgbWFwcGluZ0NBUCA9IG5ldyBTdWZmaXhNYXBwaW5nKCIuSkoiLCAiLkpKIik7Ci0KLSAgICBTb3VyY2VJbmNsdXNpb25TY2FubmVyIHNjYW5uZXIgPSBuZXcgU3RhbGVTb3VyY2VTY2FubmVyKHN0YWxlTWlsbGlzKTsKLQotICAgIHNjYW5uZXIuYWRkU291cmNlTWFwcGluZyhtYXBwaW5nKTsKLSAgICBzY2FubmVyLmFkZFNvdXJjZU1hcHBpbmcobWFwcGluZ0NBUCk7Ci0KLSAgICBTZXQgc3RhbGVTb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIEZpbGUgc291cmNlRGlyID0gbmV3IEZpbGUoc291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIHN0YWxlU291cmNlcy5hZGRBbGwoc2Nhbm5lci5nZXRJbmNsdWRlZFNvdXJjZXMoc291cmNlRGlyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wRGlyZWN0b3J5KSk7Ci0gICAgfQotICAgIGNhdGNoIChJbmNsdXNpb25TY2FuRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIHNjYW5uaW5nIHNvdXJjZSByb290OiBcJyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZURpciArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwnIGZvciBzdGFsZSBncmFtbWFycyB0byByZXByb2Nlc3MuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhbGVTb3VyY2VzOwotICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmMyYzNlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLX5+TGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLX5+b3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotfn5kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLX5+cmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLX5+dG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLX5+IkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLX5+d2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLX5+DQotfn5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1+fg0KLX5+VW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLX5+c29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1+fiJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLX5+S0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotfn5zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotfn51bmRlciB0aGUgTGljZW5zZS4NCi1+fg0KLQ0KLS0tLS0tLQ0KLSBNYXZlbiAyIEphdmFDQyBwbHVnaW4gDQotIC0tLS0tLQ0KLSA8anJ1aXpAZXhpc3QuY29tPg0KLSBKZXNzZSBNY0Nvbm5lbGwgPGplc3NlLm1jY29ubmVsbEBnbWFpbC5jb20+DQotIC0tLS0tLQ0KLSBKdWx5IDI3IDIwMDUNCi0gLS0tLS0tDQotDQotTWF2ZW4gMiBKYXZhQ0MgcGx1Z2luDQotDQotIFRoaXMgcGx1Z2luIGlzIGZvciBwcm9jZXNzaW5nIGphdmFjYyBmaWxlcyBpbnRvIGphdmEgc291cmNlcy4NCi0NCi0gaHR0cHM6Ly9qYXZhY2MuZGV2LmphdmEubmV0DQotDQotIFRoaXMgcGx1Z2luIHdpbGwgcHJvY2VzcyBhbGwgKi5qaiBmaWxlcyBpbiB0aGUgc291cmNlRGlyZWN0b3J5IGludG8gYSANCi0gY29tbW9uIGdlbmVyYXRlZCBzb3VyY2VzIG91dHB1dCBkaXJlY3RvcnkuICBUaGlzIHdpbGwgb2NjdXIgZHVyaW5nIHRoZSANCi0gZ2VuZXJhdGUtcmVzb3VyY2VzIHBoYXNlIGFuZCB0aGUgc291cmNlcyBkaXJlY3Rvcnkgd2lsbCBiZSBhZGRlZCB0byB0aGUgcHJvamVjdA0KLSBmb3IgdGhlIGNvbXBpbGUgcGhhc2UuDQotIA0KLUF2YWlsYWJsZSBDb25maWd1cmF0aW9uIE9wdGlvbnM6IChwYXJhbSAtIGRlZmF1bHQgdmFsdWUpDQotIA0KLSAqIHNvdXJjZURpcmVjdG9yeSAtIHNyYy9tYWluL2phdmFjYw0KLSANCi0gKiBvdXRwdXREaXJlY3RvcnkgLSB0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvamF2YWNjDQotIA0KLSAqIHRpbWVzdGFtcERpcmVjdG9yeSAtIHRhcmdldCAodXNlZCBzbyBncmFtbWVycyBhcmUgbm90IGNvbnN0YW50bHkgcmVnZW5lcmF0ZWQpDQotIA0KLSAqIGxvb2tBaGVhZCAtIDENCi0NCi0gKiBjaG9pY2VBbWJpZ3VpdHlDaGVjayAtIDINCi0NCi0gKiBvdGhlckFtYmlndWl0eUNoZWNrIC0gMQ0KLQ0KLSAqIGlzU3RhdGljIC0gdHJ1ZQ0KLQ0KLSAqIGRlYnVnUGFyc2VyIC0gZmFsc2UNCi0NCi0gKiBkZWJ1Z0xvb2tBaGVhZCAtIGZhbHNlDQotDQotICogZGVidWdUb2tlbk1hbmFnZXIgLSBmYWxzZQ0KLQ0KLSAqIG9wdGltaXplVG9rZW5NYW5hZ2VyIC0gdHJ1ZQ0KLQ0KLSAqIGVycm9yUmVwb3J0aW5nIC0gdHJ1ZQ0KLQ0KLSAqIGphdmFVbmljb2RlRXNjYXBlIC0gZmFsc2UNCi0NCi0gKiB1bmljb2RlSW5wdXQgLSBmYWxzZQ0KLQ0KLSAqIGlnbm9yZUNhc2UgLSBmYWxzZQ0KLQ0KLSAqIGNvbW1vblRva2VuQWN0aW9uIC0gZmFsc2UNCi0NCi0gKiB1c2VyVG9rZW5NYW5hZ2VyIC0gZmFsc2UNCi0NCi0gKiB1c2VyQ2hhclN0cmVhbSAtIGZhbHNlDQotDQotICogYnVpbGRQYXJzZXIgLSB0cnVlDQotDQotICogYnVpbGRUb2tlbk1hbmFnZXIgLSB0cnVlDQotDQotICogc2FuaXR5Q2hlY2sgLSB0cnVlDQotDQotICogZm9yY2VMYUNoZWNrIC0gZmFsc2UNCi0NCi0gKiBjYWNoZVRva2VucyAtIGZhbHNlDQotDQotICoga2VlcExpbmVDb2x1bW4gLSB0cnVlDQotIA0KLSBbXQ0KLSANCi1Vc2FnZToNCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotPHByb2plY3Q+DQotICAgLi4uDQotICAgICAgPGJ1aWxkPg0KLSAgICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFjYy1wbHVnaW48L2FydGlmYWN0SWQ+DQotCSAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotCSAgICAgICA8ZXhlY3V0aW9ucz4NCi0JICAgICAgICAgIDxleGVjdXRpb24+DQotCSAgICAgICAgICAgICA8Z29hbHM+DQotCSAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZTwvZ29hbD4NCi0JICAgICAgICAgICAgIDwvZ29hbHM+DQotCSAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0JICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgLi4uDQotICAgICAgPC9idWlsZD4NCi0gICAuLi4NCi08L3Byb2plY3Q+DQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2NmU5ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08cHJvamVjdCBuYW1lPSJNb2pvIj4NCi0gICA8YmFubmVyTGVmdD4NCi0gICAgICA8bmFtZT5Nb2pvPC9uYW1lPg0KLSAgICAgIDxzcmM+L2ltYWdlcy9tb2pvX2xvZ28ucG5nPC9zcmM+DQotICAgICAgPGhyZWY+aHR0cDovL21vam8uY29kZWhhdXMub3JnPC9ocmVmPg0KLSAgIDwvYmFubmVyTGVmdD4NCi0gICA8YmFubmVyUmlnaHQ+DQotICAgICAgPG5hbWU+Q29kZWhhdXM8L25hbWU+DQotICAgICAgPHNyYz5odHRwOi8vbW9qby5jb2RlaGF1cy5vcmcvaW1hZ2VzL2NvZGVoYXVzLXNtYWxsLnBuZzwvc3JjPg0KLSAgICAgIDxocmVmPmh0dHA6Ly93d3cuY29kZWhhdXMub3JnPC9ocmVmPg0KLSAgIDwvYmFubmVyUmlnaHQ+DQotICAgPGJvZHk+DQotICAgICAgPGxpbmtzPg0KLSAgICAgICAgIDxpdGVtIG5hbWU9Ik1vam8iIGhyZWY9Imh0dHA6Ly9tb2pvLmNvZGVoYXVzLm9yZyIvPg0KLSAgICAgICAgIDxpdGVtIG5hbWU9Ik1hdmVuIiBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIiLz4NCi0gICAgICA8L2xpbmtzPg0KLSAgICAgIDxtZW51IG5hbWU9Ik1vam8iPg0KLSAgICAgICAgIDxpdGVtIG5hbWU9Im1vam8iIGhyZWY9Imh0dHA6Ly9tb2pvLmNvZGVoYXVzLm9yZyIvPg0KLSAgICAgIDwvbWVudT4NCi0gICAgICAke3JlcG9ydHN9DQotICAgPC9ib2R5Pg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFjYy9KYXZhQ0NNb2pvVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhY2MvSmF2YUNDTW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4NjYzMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFjYy9KYXZhQ0NNb2pvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFjYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhY2MuSmF2YUNDTW9qbzsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YUNDTW9qb1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0aW9uKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIEphdmFDQ01vam8gbW9qbyA9IG5ldyBKYXZhQ0NNb2pvKCk7Ci0gICAgLy9UT0RPOiB3cml0ZSBhIHRlc3QgaGVyZS4uLgotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL1NlbGVjdG9yUGFyc2VyLmpqIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9TZWxlY3RvclBhcnNlci5qagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwNjQ5OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL1NlbGVjdG9yUGFyc2VyLmpqCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qKiAKLSAqIDxhIGhyZWY9Imh0dHA6Ly9hY3RpdmVtcS5vcmciPkFjdGl2ZU1ROiBUaGUgT3BlbiBTb3VyY2UgTWVzc2FnZSBGYWJyaWM8L2E+Ci0gKgotICogQ29weXJpZ2h0IDIwMDQgSGlyYW0gQ2hpcmlubwotICogQ29weXJpZ2h0IDIwMDQgUHJvdGlxdWUgTHRkCi0gKiAKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqIAotICoqLwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBPUFRJT05TCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1vcHRpb25zIHsKLSAgU1RBVElDID0gdHJ1ZTsKLSAgVU5JQ09ERV9JTlBVVCA9IGZhbHNlOwotICAKLSAgIC8vc29tZSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zCi0gIE9QVElNSVpFX1RPS0VOX01BTkFHRVIgPSBmYWxzZTsKLSAgRVJST1JfUkVQT1JUSU5HID0gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUEFSU0VSCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBBUlNFUl9CRUdJTihTZWxlY3RvclBhcnNlcikKLQotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC5qbXMuSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFjdGl2ZW1xLmZpbHRlci4qOwotCi0vKiogCi0gKiBKTVMgU2VsZWN0b3IgUGFyc2VyIGdlbmVyYXRlZCBieSBKYXZhQ0MKLSAqIAotICogRG8gbm90IGVkaXQgdGhpcyAuamF2YSBmaWxlIGRpcmVjdGx5IC0gaXQgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIFNlbGVjdG9yUGFyc2VyLmpqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RvclBhcnNlciB7Ci0KLSAgICBwdWJsaWMgU2VsZWN0b3JQYXJzZXIoKSB7Ci0gICAgICAgIHRoaXMobmV3IFN0cmluZ1JlYWRlcigiIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbiBwYXJzZShTdHJpbmcgc3FsKSB0aHJvd3MgSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5SZUluaXQobmV3IFN0cmluZ1JlYWRlcihzcWwpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuSm1zU2VsZWN0b3IoKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JICAgICAgICB0aHJvdyAoSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uKW5ldyBJbnZhbGlkU2VsZWN0b3JFeGNlcHRpb24oInRlc3QiKS5pbml0Q2F1c2UoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbkV4cHJlc3Npb24gYXNCb29sZWFuRXhwcmVzc2lvbihFeHByZXNzaW9uIHZhbHVlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbkV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbkV4cHJlc3Npb24pIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb3BlcnR5RXhwcmVzc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVCb29sZWFuQ2FzdCggdmFsdWUgKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkV4cHJlc3Npb24gd2lsbCBub3QgcmVzdWx0IGluIGEgYm9vbGVhbiB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0KLX0KLQotUEFSU0VSX0VORChTZWxlY3RvclBhcnNlcikKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVG9rZW5zCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qIFdoaXRlIFNwYWNlICovCi1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgIiAiIHwgIlx0IiB8ICJcbiIgfCAiXHIiIHwgIlxmIgotfQotCi0vKiBDb21tZW50cyAqLwotU0tJUDoKLXsKLSAgPExJTkVfQ09NTUVOVDogIi0tIiAoflsiXG4iLCJcciJdKSogKCJcbiJ8IlxyInwiXHJcbiIpID4KLX0KLQotU0tJUDoKLXsKLSAgPEJMT0NLX0NPTU1FTlQ6ICIvKiIgKH5bIioiXSkqICIqIiAoIioiIHwgKH5bIioiLCIvIl0gKH5bIioiXSkqICIqIikpKiAiLyI+Ci19Ci0KLS8qIFJlc2VydmVkIFdvcmRzICovCi1UT0tFTiBbSUdOT1JFX0NBU0VdIDoKLXsKLSAgICA8ICBOT1QgICAgIDogIk5PVCI+Ci0gIHwgPCAgQU5EICAgICA6ICJBTkQiPgotICB8IDwgIE9SICAgICAgOiAiT1IiPgotICB8IDwgIEJFVFdFRU4gOiAiQkVUV0VFTiI+Ci0gIHwgPCAgTElLRSAgICA6ICJMSUtFIj4KLSAgfCA8ICBFU0NBUEUgIDogIkVTQ0FQRSI+Ci0gIHwgPCAgSU4gICAgICA6ICJJTiI+Ci0gIHwgPCAgSVMgICAgICA6ICJJUyI+Ci0gIHwgPCAgVFJVRSAgICA6ICJUUlVFIiA+Ci0gIHwgPCAgRkFMU0UgICA6ICJGQUxTRSIgPgotICB8IDwgIE5VTEwgICAgOiAiTlVMTCIgPgotICB8IDwgIFhQQVRIICAgOiAiWFBBVEgiID4KLSAgfCA8ICBYUVVFUlkgIDogIlhRVUVSWSIgPgotfQotCi0vKiBMaXRlcmFscyAqLwotVE9LRU4gW0lHTk9SRV9DQVNFXSA6Ci17Ci0KLSAgICA8IERFQ0lNQUxfTElURVJBTDogWyIxIi0iOSJdIChbIjAiLSI5Il0pKiAoWyJsIiwiTCJdKT8gPgotICB8IDwgSEVYX0xJVEVSQUw6ICIwIiBbIngiLCJYIl0gKFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0pKyA+Ci0gIHwgPCBPQ1RBTF9MSVRFUkFMOiAiMCIgKFsiMCItIjciXSkqID4gIAotICB8IDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDogIAkJICAKLSAgICAgICAgICAoWyIwIi0iOSJdKSsgIi4iIChbIjAiLSI5Il0pKiAoPEVYUE9ORU5UPik/IC8vIG1hdGNoZXM6IDUuNSBvciA1LiBvciA1LjVFMTAgb3IgNS5FMTAKLSAgICAgICAgfCAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8gICAgICAgICAgICAgIC8vIG1hdGNoZXM6IC41IG9yIC41RTEwCi0gICAgICAgIHwgKFsiMCItIjkiXSkrIDxFWFBPTkVOVD4gICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGVzOiA1RTEwCi0gICAgPgotICB8IDwgI0VYUE9ORU5UOiAiRSIgKFsiKyIsIi0iXSk/IChbIjAiLSI5Il0pKyA+Ci0gIHwgPCBTVFJJTkdfTElURVJBTDogIiciICggKCInJyIpIHwgflsiJyJdICkqICAiJyIgPgotfQotCi1UT0tFTiBbSUdOT1JFX0NBU0VdIDoKLXsKLSAgICA8IElEIDogWyJhIi0ieiIsICJfIiwgIiQiXSAoWyJhIi0ieiIsIjAiLSI5IiwiXyIsICIkIl0pKiA+Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEdyYW1tZXIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUJvb2xlYW5FeHByZXNzaW9uIEptc1NlbGVjdG9yKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdD1udWxsOwotfQotewotICAgICgKLSAgICAgICAgbGVmdCA9IG9yRXhwcmVzc2lvbigpCi0gICAgKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpOwotICAgIH0KLQotfQotCi1FeHByZXNzaW9uIG9yRXhwcmVzc2lvbigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLX0KLXsKLSAgICAoCi0gICAgICAgIGxlZnQgPSBhbmRFeHByZXNzaW9uKCkgCi0gICAgICAgICggCi0gICAgICAgICAgICA8T1I+IHJpZ2h0ID0gYW5kRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBMb2dpY0V4cHJlc3Npb24uY3JlYXRlT1IoYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KSwgYXNCb29sZWFuRXhwcmVzc2lvbihyaWdodCkpOwotICAgICAgICAgICAgfQotICAgICAgICApKgotICAgICkgCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci0KLX0KLQotCi1FeHByZXNzaW9uIGFuZEV4cHJlc3Npb24oKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci19Ci17Ci0gICAgKAotICAgICAgICBsZWZ0ID0gZXF1YWxpdHlFeHByZXNzaW9uKCkgCi0gICAgICAgICggCi0gICAgICAgICAgICA8QU5EPiByaWdodCA9IGVxdWFsaXR5RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBMb2dpY0V4cHJlc3Npb24uY3JlYXRlQU5EKGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCksIGFzQm9vbGVhbkV4cHJlc3Npb24ocmlnaHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKSoKLSAgICApIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQotCi1FeHByZXNzaW9uIGVxdWFsaXR5RXhwcmVzc2lvbigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLX0KLXsKLSAgICAoCi0gICAgICAgIGxlZnQgPSBjb21wYXJpc29uRXhwcmVzc2lvbigpIAotICAgICAgICAoIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAiPSIgcmlnaHQgPSBjb21wYXJpc29uRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVFcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICAgICAiPD4iIHJpZ2h0ID0gY29tcGFyaXNvbkV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90RXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAgICAgTE9PS0FIRUFEKDIpCi0gICAgICAgICAgICA8SVM+IDxOVUxMPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVJc051bGwobGVmdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICAgICA8SVM+IDxOT1Q+IDxOVUxMPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVJc05vdE51bGwobGVmdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICkqCi0gICAgKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KLQotRXhwcmVzc2lvbiBjb21wYXJpc29uRXhwcmVzc2lvbigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLSAgICBFeHByZXNzaW9uIGxvdzsKLSAgICBFeHByZXNzaW9uIGhpZ2g7Ci0gICAgU3RyaW5nIHQsIHU7Ci0JYm9vbGVhbiBub3Q7Ci0JQXJyYXlMaXN0IGxpc3Q7Ci19Ci17Ci0gICAgKAotICAgICAgICBsZWZ0ID0gYWRkRXhwcmVzc2lvbigpIAotICAgICAgICAoIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIj4iIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUdyZWF0ZXJUaGFuKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIj49IiByaWdodCA9IGFkZEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVHcmVhdGVyVGhhbkVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIjwiIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUxlc3NUaGFuKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIjw9IiByaWdodCA9IGFkZEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVMZXNzVGhhbkVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIHwKLQkJCQl7Ci0JCQkJCXU9bnVsbDsKLQkJCQl9ICAgICAgICAgICAJCQotCQkgICAgICAgIDxMSUtFPiB0ID0gc3RyaW5nTGl0dGVyYWwoKSAKLQkJICAgICAgICAJWyA8RVNDQVBFPiB1ID0gc3RyaW5nTGl0dGVyYWwoKSBdCi0JCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTGlrZShsZWZ0LCB0LCB1KTsKLQkJICAgICAgICB9Ci0gICAgICAgICAgIHwKLQkgICAgICAgIAlMT09LQUhFQUQoMikKLQkJCQl7Ci0JCQkJCXU9bnVsbDsKLQkJCQl9ICAgICAgICAgICAJCQotCQkgICAgICAgIDxOT1Q+IDxMSUtFPiB0ID0gc3RyaW5nTGl0dGVyYWwoKSBbIDxFU0NBUEU+IHUgPSBzdHJpbmdMaXR0ZXJhbCgpIF0KLQkJICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RMaWtlKGxlZnQsIHQsIHUpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgIHwKLQkJICAgICAgICA8QkVUV0VFTj4gbG93ID0gYWRkRXhwcmVzc2lvbigpIDxBTkQ+IGhpZ2ggPSBhZGRFeHByZXNzaW9uKCkKLQkJICAgICAgICB7Ci0JCQkJCWxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVCZXR3ZWVuKGxlZnQsIGxvdywgaGlnaCk7Ci0JCSAgICAgICAgfQotCSAgICAgICAgfAotCSAgICAgICAgCUxPT0tBSEVBRCgyKQotCQkgICAgICAgIDxOT1Q+IDxCRVRXRUVOPiBsb3cgPSBhZGRFeHByZXNzaW9uKCkgPEFORD4gaGlnaCA9IGFkZEV4cHJlc3Npb24oKQotCQkgICAgICAgIHsKLQkJCQkJbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdEJldHdlZW4obGVmdCwgbG93LCBoaWdoKTsKLQkJICAgICAgICB9Ci0gICAgICAgICAgICB8Ci0JCQkJPElOPiAKLQkJICAgICAgICAiKCIgCi0JCSAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpCi0JCSAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgICggCi0JCQkgICAgICAgIAkiLCIKLQkJCSAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpIAotCQkJICAgICAgICAgICAgewotCQkJCSAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0JCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgIAkKLQkJCSAgICAgICAgKSoKLQkJICAgICAgICAiKSIKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUluRmlsdGVyKGxlZnQsIGxpc3QpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgIHwKLQkgICAgICAgIAlMT09LQUhFQUQoMikKLQkgICAgICAgICAgICA8Tk9UPiA8SU4+IAotCQkgICAgICAgICIoIiAKLQkJICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCkKLQkJICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCSAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0JCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgKCAKLQkJCSAgICAgICAgCSIsIgotCQkJICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCkgCi0JCQkgICAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLQkJCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgCQotCQkJICAgICAgICApKgotCQkgICAgICAgICIpIgotCQkgICAgICAgIHsKLQkJICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90SW5GaWx0ZXIobGVmdCwgbGlzdCk7Ci0JCSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICkqCi0gICAgKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KLQotRXhwcmVzc2lvbiBhZGRFeHByZXNzaW9uKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotfQotewotICAgIGxlZnQgPSBtdWx0RXhwcigpIAotICAgICggCi0JICAgIExPT0tBSEVBRCggKCIrInwiLSIpIG11bHRFeHByKCkpCi0JICAgICgKLQkgICAgICAgICIrIiByaWdodCA9IG11bHRFeHByKCkgCi0JICAgICAgICB7Ci0JICAgICAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZVBsdXMobGVmdCwgcmlnaHQpOwotCSAgICAgICAgfQotCSAgICAgICAgfCAgICAgICAgICAgIAotCSAgICAgICAgIi0iIHJpZ2h0ID0gbXVsdEV4cHIoKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlTWludXMobGVmdCwgcmlnaHQpOwotCSAgICAgICAgfQotICAgICAgICApCi0gICAgICAgIAotICAgICkqCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19Ci0KLUV4cHJlc3Npb24gbXVsdEV4cHIoKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci19Ci17Ci0gICAgbGVmdCA9IHVuYXJ5RXhwcigpIAotICAgICggCi0gICAgICAgICIqIiByaWdodCA9IHVuYXJ5RXhwcigpIAotICAgICAgICB7Ci0JICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlTXVsdGlwbHkobGVmdCwgcmlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgIi8iIHJpZ2h0ID0gdW5hcnlFeHByKCkgCi0gICAgICAgIHsKLQkgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVEaXZpZGUobGVmdCwgcmlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgIiUiIHJpZ2h0ID0gdW5hcnlFeHByKCkgCi0gICAgICAgIHsKLQkgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVNb2QobGVmdCwgcmlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICkqCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19Ci0KLQotRXhwcmVzc2lvbiB1bmFyeUV4cHIoKSA6Ci17Ci0gICAgU3RyaW5nIHM9bnVsbDsKLSAgICBFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLX0KLXsKLQkoCi0JCUxPT0tBSEVBRCggIisiIHVuYXJ5RXhwcigpICkKLQkgICAgIisiIGxlZnQ9dW5hcnlFeHByKCkKLQkgICAgfAotCSAgICAiLSIgbGVmdD11bmFyeUV4cHIoKQotCSAgICB7Ci0JICAgICAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZU5lZ2F0ZShsZWZ0KTsKLQkgICAgfQotCSAgICB8Ci0JICAgIDxOT1Q+IGxlZnQ9dW5hcnlFeHByKCkKLQkgICAgewotCQkgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVOT1QoIGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCkgKTsKLQkgICAgfQotCSAgICB8Ci0JICAgIDxYUEFUSD4gcz1zdHJpbmdMaXR0ZXJhbCgpCi0JICAgIHsKLQkJICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlWFBhdGgoIHMgKTsKLQkgICAgfQotCSAgICB8Ci0JICAgIDxYUVVFUlk+IHM9c3RyaW5nTGl0dGVyYWwoKQotCSAgICB7Ci0JCSAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZVhRdWVyeSggcyApOwotCSAgICB9Ci0JICAgIHwKLQkgICAgbGVmdCA9IHByaW1hcnlFeHByKCkKLSAgICApCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci0KLX0KLQotRXhwcmVzc2lvbiBwcmltYXJ5RXhwcigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLX0KLXsKLSAgICAoCi0gICAgICAgIGxlZnQgPSBsaXRlcmFsKCkKLSAgICAgICAgfAotICAgICAgICBsZWZ0ID0gdmFyaWFibGUoKQotICAgICAgICB8Ci0gICAgICAgICIoIiBsZWZ0ID0gb3JFeHByZXNzaW9uKCkgIikiCi0gICAgKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KLQotCi0KLUNvbnN0YW50RXhwcmVzc2lvbiBsaXRlcmFsKCkgOgotewotICAgIFRva2VuIHQ7Ci0gICAgU3RyaW5nIHM7Ci0gICAgQ29uc3RhbnRFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLX0KLXsKLSAgICAoCi0gICAgICAgICgKLSAgICAgICAgICAgIHMgPSBzdHJpbmdMaXR0ZXJhbCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24ocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICkgCi0gICAgICAgIHwgCi0gICAgICAgICgKLSAgICAgICAgICAgIHQgPSA8REVDSU1BTF9MSVRFUkFMPgotICAgICAgICAgICAgewotICAgICAgICAgICAgCWxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRnJvbURlY2ltYWwodC5pbWFnZSk7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICApIAotICAgICAgICB8IAotICAgICAgICAoCi0gICAgICAgICAgICB0ID0gPEhFWF9MSVRFUkFMPgotICAgICAgICAgICAgewotICAgICAgICAgICAgCWxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRnJvbUhleCh0LmltYWdlKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICkgCi0gICAgICAgIHwgCi0gICAgICAgICgKLSAgICAgICAgICAgIHQgPSA8T0NUQUxfTElURVJBTD4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZyb21PY3RhbCh0LmltYWdlKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICkgCi0gICAgICAgIHwgCi0gICAgICAgICgKLSAgICAgICAgICAgIHQgPSA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZsb2F0KHQuaW1hZ2UpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgKSAKLSAgICAgICAgfCAKLSAgICAgICAgKAotICAgICAgICAgICAgPFRSVUU+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5UUlVFOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgKSAKLSAgICAgICAgfCAKLSAgICAgICAgKAotICAgICAgICAgICAgPEZBTFNFPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uRkFMU0U7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICApIAotICAgICAgICB8IAotICAgICAgICAoCi0gICAgICAgICAgICA8TlVMTD4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLk5VTEw7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICApCi0gICAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQotCi1TdHJpbmcgc3RyaW5nTGl0dGVyYWwoKSA6Ci17Ci0gICAgVG9rZW4gdDsKLSAgICBTdHJpbmdCdWZmZXIgcmMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYm9vbGVhbiBmaXJzdD10cnVlOwotfQotewotICAgIHQgPSA8U1RSSU5HX0xJVEVSQUw+IAotICAgIHsKLSAgICAJLy8gRGVjb2RlIHRoZSBzdGluZyB2YWx1ZS4KLSAgICAJU3RyaW5nIGltYWdlID0gdC5pbWFnZTsKLSAgICAJZm9yKCBpbnQgaT0xOyBpIDwgaW1hZ2UubGVuZ3RoKCktMTsgaSsrICkgewotICAgIAkJY2hhciBjID0gaW1hZ2UuY2hhckF0KGkpOwotICAgIAkJaWYoIGMgPT0gJ1wnJyApCi0gICAgCQkJaSsrOyAgICAJCQkKLSAgIAkJCXJjLmFwcGVuZChjKTsKLSAgICAJfQotCSAgICByZXR1cm4gcmMudG9TdHJpbmcoKTsKLSAgICB9ICAgIAotfQotCi1Qcm9wZXJ0eUV4cHJlc3Npb24gdmFyaWFibGUoKSA6Ci17Ci0gICAgVG9rZW4gdDsKLSAgICBQcm9wZXJ0eUV4cHJlc3Npb24gbGVmdD1udWxsOwotfQotewotICAgICggCi0gICAgICAgIHQgPSA8SUQ+IAotICAgICAgICB7Ci0gICAgICAgICAgICBsZWZ0ID0gbmV3IFByb3BlcnR5RXhwcmVzc2lvbih0LmltYWdlKTsKLSAgICAgICAgfSAgICAKLSAgICApCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvUGFyc2VFeGNlcHRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1BhcnNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTI2MzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFBhcnNlRXhjZXB0aW9uLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCi0gKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQotICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAotICogcGFyc2VyLgotICoKLSAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCi0gKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCi0gICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcwotICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCi0gICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0Ci0gICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKLSAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bwotICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKLSAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+Ci0gICAqLwotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAotICAgICAgICAgICAgICAgICAgICAgICApCi0gIHsKLSAgICBzdXBlcigiIik7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7Ci0gICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7Ci0gICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgotICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCi0gICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCi0gICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCi0gICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgotICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCi0gICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KLSAgICovCi0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKCk7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCi0gICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCi0gICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgotICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgotICAgKi8KLSAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKLQotICAvKioKLSAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQotICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCi0gICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KLSAgICovCi0gIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCi0gICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcwotICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KLSAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCi0gICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQotICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAotICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCi0gICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKLSAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQotICAgKiBnZXRzIGRpc3BsYXllZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgewotICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgU3RyaW5nIGV4cGVjdGVkID0gIiI7Ci0gICAgaW50IG1heFNpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKG1heFNpemUgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCkgewotICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgZXhwZWN0ZWQgKz0gdG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSArICIgIjsKLSAgICAgIH0KLSAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgewotICAgICAgICBleHBlY3RlZCArPSAiLi4uIjsKLSAgICAgIH0KLSAgICAgIGV4cGVjdGVkICs9IGVvbCArICIgICAgIjsKLSAgICB9Ci0gICAgU3RyaW5nIHJldHZhbCA9ICJFbmNvdW50ZXJlZCBcIiI7Ci0gICAgVG9rZW4gdG9rID0gY3VycmVudFRva2VuLm5leHQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHJldHZhbCArPSAiICI7Ci0gICAgICBpZiAodG9rLmtpbmQgPT0gMCkgewotICAgICAgICByZXR2YWwgKz0gdG9rZW5JbWFnZVswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKLSAgICAgIHRvayA9IHRvay5uZXh0OyAKLSAgICB9Ci0gICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOwotICAgIHJldHZhbCArPSAiLiIgKyBlb2w7Ci0gICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKLSAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7Ci0gICAgfQotICAgIHJldHZhbCArPSBleHBlY3RlZDsKLSAgICByZXR1cm4gcmV0dmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotIAotICAvKioKLSAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgotICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKLSAgICogc3RyaW5nIGxpdGVyYWwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBjaGFyIGNoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOwotICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViNTk1OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNlbGVjdG9yUGFyc2VyLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXguam1zLkludmFsaWRTZWxlY3RvckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hY3RpdmVtcS5maWx0ZXIuKjsKLQotLyoqIAotICogSk1TIFNlbGVjdG9yIFBhcnNlciBnZW5lcmF0ZWQgYnkgSmF2YUNDCi0gKiAKLSAqIERvIG5vdCBlZGl0IHRoaXMgLmphdmEgZmlsZSBkaXJlY3RseSAtIGl0IGlzIGF1dG9nZW5lcmF0ZWQgZnJvbSBTZWxlY3RvclBhcnNlci5qagotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3JQYXJzZXIgaW1wbGVtZW50cyBTZWxlY3RvclBhcnNlckNvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgU2VsZWN0b3JQYXJzZXIoKSB7Ci0gICAgICAgIHRoaXMobmV3IFN0cmluZ1JlYWRlcigiIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbiBwYXJzZShTdHJpbmcgc3FsKSB0aHJvd3MgSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5SZUluaXQobmV3IFN0cmluZ1JlYWRlcihzcWwpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuSm1zU2VsZWN0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uKW5ldyBJbnZhbGlkU2VsZWN0b3JFeGNlcHRpb24oInRlc3QiKS5pbml0Q2F1c2UoZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgQm9vbGVhbkV4cHJlc3Npb24gYXNCb29sZWFuRXhwcmVzc2lvbihFeHByZXNzaW9uIHZhbHVlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbkV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbkV4cHJlc3Npb24pIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb3BlcnR5RXhwcmVzc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVCb29sZWFuQ2FzdCggdmFsdWUgKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkV4cHJlc3Npb24gd2lsbCBub3QgcmVzdWx0IGluIGEgYm9vbGVhbiB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICB9Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEdyYW1tZXIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgZmluYWwgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uIEptc1NlbGVjdG9yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLSAgICBsZWZ0ID0gb3JFeHByZXNzaW9uKCk7Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCk7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBvckV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotICAgIGxlZnQgPSBhbmRFeHByZXNzaW9uKCk7Ci0gICAgbGFiZWxfMToKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIE9SOgotICAgICAgICA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWsgbGFiZWxfMTsKLSAgICAgIH0KLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oT1IpOwotICAgICAgcmlnaHQgPSBhbmRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IExvZ2ljRXhwcmVzc2lvbi5jcmVhdGVPUihhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpLCBhc0Jvb2xlYW5FeHByZXNzaW9uKHJpZ2h0KSk7Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gYW5kRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci0gICAgbGVmdCA9IGVxdWFsaXR5RXhwcmVzc2lvbigpOwotICAgIGxhYmVsXzI6Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBBTkQ6Ci0gICAgICAgIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhayBsYWJlbF8yOwotICAgICAgfQotICAgICAgampfY29uc3VtZV90b2tlbihBTkQpOwotICAgICAgcmlnaHQgPSBlcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gTG9naWNFeHByZXNzaW9uLmNyZWF0ZUFORChhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpLCBhc0Jvb2xlYW5FeHByZXNzaW9uKHJpZ2h0KSk7Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gZXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLSAgICBsZWZ0ID0gY29tcGFyaXNvbkV4cHJlc3Npb24oKTsKLSAgICBsYWJlbF8zOgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSVM6Ci0gICAgICBjYXNlIDI4OgotICAgICAgY2FzZSAyOToKLSAgICAgICAgOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrIGxhYmVsXzM7Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgMjg6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMjgpOwotICAgICAgICByaWdodCA9IGNvbXBhcmlzb25FeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI5OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDI5KTsKLSAgICAgICAgcmlnaHQgPSBjb21wYXJpc29uRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RFcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKGpqXzJfMSgyKSkgewotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSVMpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTlVMTCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUlzTnVsbChsZWZ0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIElTOgotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihJUyk7Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVCk7Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVJc05vdE51bGwobGVmdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBjb21wYXJpc29uRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci0gICAgRXhwcmVzc2lvbiBsb3c7Ci0gICAgRXhwcmVzc2lvbiBoaWdoOwotICAgIFN0cmluZyB0LCB1OwotICAgICAgICBib29sZWFuIG5vdDsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3Q7Ci0gICAgbGVmdCA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICBsYWJlbF80OgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTk9UOgotICAgICAgY2FzZSBCRVRXRUVOOgotICAgICAgY2FzZSBMSUtFOgotICAgICAgY2FzZSBJTjoKLSAgICAgIGNhc2UgMzA6Ci0gICAgICBjYXNlIDMxOgotICAgICAgY2FzZSAzMjoKLSAgICAgIGNhc2UgMzM6Ci0gICAgICAgIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhayBsYWJlbF80OwotICAgICAgfQotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIDMwOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDMwKTsKLSAgICAgICAgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVHcmVhdGVyVGhhbihsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzMToKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzMSk7Ci0gICAgICAgIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlR3JlYXRlclRoYW5FcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzMjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzMik7Ci0gICAgICAgIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTGVzc1RoYW4obGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzMpOwotICAgICAgICByaWdodCA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUxlc3NUaGFuRXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTElLRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1PW51bGw7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTElLRSk7Ci0gICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBFU0NBUEU6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihFU0NBUEUpOwotICAgICAgICAgIHUgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTGlrZShsZWZ0LCB0LCB1KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoampfMl8yKDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdT1udWxsOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKExJS0UpOwotICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgRVNDQVBFOgotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihFU0NBUEUpOwotICAgICAgICAgICAgdSA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdExpa2UobGVmdCwgdCwgdSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBCRVRXRUVOOgotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihCRVRXRUVOKTsKLSAgICAgICAgICAgIGxvdyA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQU5EKTsKLSAgICAgICAgICAgIGhpZ2ggPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUJldHdlZW4obGVmdCwgbG93LCBoaWdoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoampfMl8zKDIpKSB7Ci0gICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UKTsKLSAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihCRVRXRUVOKTsKLSAgICAgICAgICAgICAgbG93ID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFORCk7Ci0gICAgICAgICAgICAgIGhpZ2ggPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdEJldHdlZW4obGVmdCwgbG93LCBoaWdoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgICAgICBjYXNlIElOOgotICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU4pOwotICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzQpOwotICAgICAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0gICAgICAgICAgICAgICAgbGFiZWxfNToKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgbGFiZWxfNTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzUpOwotICAgICAgICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUluRmlsdGVyKGxlZnQsIGxpc3QpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChqal8yXzQoMikpIHsKLSAgICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UKTsKLSAgICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU4pOwotICAgICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigzNCk7Ci0gICAgICAgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotICAgICAgICAgICAgICAgICAgbGFiZWxfNjoKLSAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICBicmVhayBsYWJlbF82OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzUpOwotICAgICAgICAgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdEluRmlsdGVyKGxlZnQsIGxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIGFkZEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotICAgIGxlZnQgPSBtdWx0RXhwcigpOwotICAgIGxhYmVsXzc6Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGlmIChqal8yXzUoMjE0NzQ4MzY0NykpIHsKLSAgICAgICAgOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWsgbGFiZWxfNzsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSAzNzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzNyk7Ci0gICAgICAgIHJpZ2h0ID0gbXVsdEV4cHIoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZVBsdXMobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzgpOwotICAgICAgICByaWdodCA9IG11bHRFeHByKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVNaW51cyhsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIG11bHRFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLSAgICBsZWZ0ID0gdW5hcnlFeHByKCk7Ci0gICAgbGFiZWxfODoKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIDM5OgotICAgICAgY2FzZSA0MDoKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhayBsYWJlbF84OwotICAgICAgfQotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIDM5OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM5KTsKLSAgICAgICAgcmlnaHQgPSB1bmFyeUV4cHIoKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlTXVsdGlwbHkobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDA6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oNDApOwotICAgICAgICByaWdodCA9IHVuYXJ5RXhwcigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVEaXZpZGUobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oNDEpOwotICAgICAgICByaWdodCA9IHVuYXJ5RXhwcigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVNb2QobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiB1bmFyeUV4cHIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFN0cmluZyBzPW51bGw7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci0gICAgaWYgKGpqXzJfNigyMTQ3NDgzNjQ3KSkgewotICAgICAgampfY29uc3VtZV90b2tlbigzNyk7Ci0gICAgICBsZWZ0ID0gdW5hcnlFeHByKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSAzODoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzOCk7Ci0gICAgICAgIGxlZnQgPSB1bmFyeUV4cHIoKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZU5lZ2F0ZShsZWZ0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5PVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QpOwotICAgICAgICBsZWZ0ID0gdW5hcnlFeHByKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlTk9UKCBhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYUEFUSDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihYUEFUSCk7Ci0gICAgICAgIHMgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZVhQYXRoKCBzICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYUVVFUlk6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oWFFVRVJZKTsKLSAgICAgICAgcyA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlWFF1ZXJ5KCBzICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIElEOgotICAgICAgY2FzZSAzNDoKLSAgICAgICAgbGVmdCA9IHByaW1hcnlFeHByKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIHByaW1hcnlFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLSAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICBjYXNlIFRSVUU6Ci0gICAgY2FzZSBGQUxTRToKLSAgICBjYXNlIE5VTEw6Ci0gICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBsZWZ0ID0gbGl0ZXJhbCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJRDoKLSAgICAgIGxlZnQgPSB2YXJpYWJsZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzNDoKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzQpOwotICAgICAgbGVmdCA9IG9yRXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbigzNik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgQ29uc3RhbnRFeHByZXNzaW9uIGxpdGVyYWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIHQ7Ci0gICAgU3RyaW5nIHM7Ci0gICAgQ29uc3RhbnRFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLSAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgcyA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24ocyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKERFQ0lNQUxfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGcm9tRGVjaW1hbCh0LmltYWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICB0ID0gampfY29uc3VtZV90b2tlbihIRVhfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGcm9tSGV4KHQuaW1hZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oT0NUQUxfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGcm9tT2N0YWwodC5pbWFnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICB0ID0gampfY29uc3VtZV90b2tlbihGTE9BVElOR19QT0lOVF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZsb2F0KHQuaW1hZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUUlVFOgotICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLlRSVUU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZBTFNFOgotICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5GQUxTRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVMTDoKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTlVMTCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5OVUxMOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFN0cmluZyBzdHJpbmdMaXR0ZXJhbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgVG9rZW4gdDsKLSAgICBTdHJpbmdCdWZmZXIgcmMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYm9vbGVhbiBmaXJzdD10cnVlOwotICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKLSAgICAgICAgLy8gRGVjb2RlIHRoZSBzdGluZyB2YWx1ZS4KLSAgICAgICAgU3RyaW5nIGltYWdlID0gdC5pbWFnZTsKLSAgICAgICAgZm9yKCBpbnQgaT0xOyBpIDwgaW1hZ2UubGVuZ3RoKCktMTsgaSsrICkgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9IGltYWdlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZiggYyA9PSAnXCcnICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJjLmFwcGVuZChjKTsKLSAgICAgICAgfQotICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmMudG9TdHJpbmcoKTt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBQcm9wZXJ0eUV4cHJlc3Npb24gdmFyaWFibGUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIHQ7Ci0gICAgUHJvcGVydHlFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLSAgICB0ID0gampfY29uc3VtZV90b2tlbihJRCk7Ci0gICAgICAgICAgICBsZWZ0ID0gbmV3IFByb3BlcnR5RXhwcmVzc2lvbih0LmltYWdlKTsKLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzEoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMyhpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzMoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM180KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfNSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzYoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzMikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ4KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl81NigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihPUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM0KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM2KSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0KCkgewotICAgIGlmIChqal8zUl8yNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzApKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ0KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl80OSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzUxKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81MigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfNCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMoKSB7Ci0gICAgaWYgKGpqXzNSXzI2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MygpIHsKLSAgICBpZiAoampfM1JfOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNDgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgoKSB7Ci0gICAgaWYgKGpqXzNSXzM3KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8zOCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzI0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNygpIHsKLSAgICBpZiAoampfM1JfMjIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNUUklOR19MSVRFUkFMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM1KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihYUVVFUlkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxKCkgewotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNDQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRVNDQVBFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTk9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNjEoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICBpZiAoampfc2Nhbl90b2tlbigzNikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzcpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFhQQVRIKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOT1QpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5VTEwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzcpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzYwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzYpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSVMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOT1QpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOVUxMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM4KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGQUxTRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSVMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOVUxMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xMigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFRSVUUpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOT1QpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihCRVRXRUVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKEFORCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl80NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNDYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNDcoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQkVUV0VFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEVTQ0FQRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oT0NUQUxfTElURVJBTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0MSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzkoKSB7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl80MigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTk9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTElLRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNTkoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTElLRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNTgoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSEVYX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDApKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM5KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKERFQ0lNQUxfTElURVJBTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85KCkgewotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTEoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkoKSB7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl85KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNygpIHsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzQwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM4KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChqal8zUl85KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zMSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzM2KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM3KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyIHRva2VuX3NvdXJjZTsKLSAgU2ltcGxlQ2hhclN0cmVhbSBqal9pbnB1dF9zdHJlYW07Ci0gIHB1YmxpYyBUb2tlbiB0b2tlbiwgampfbnQ7Ci0gIHByaXZhdGUgaW50IGpqX250azsKLSAgcHJpdmF0ZSBUb2tlbiBqal9zY2FucG9zLCBqal9sYXN0cG9zOwotICBwcml2YXRlIGludCBqal9sYTsKLSAgcHVibGljIGJvb2xlYW4gbG9va2luZ0FoZWFkID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBqal9zZW1MQTsKLQotICBwdWJsaWMgU2VsZWN0b3JQYXJzZXIoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgU2VsZWN0b3JQYXJzZXIoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3RvclBhcnNlcihTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBUb2tlbiBqal9jb25zdW1lX3Rva2VuKGludCBraW5kKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIG9sZFRva2VuOwotICAgIGlmICgob2xkVG9rZW4gPSB0b2tlbikubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgaWYgKHRva2VuLmtpbmQgPT0ga2luZCkgewotICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLSAgICB0b2tlbiA9IG9sZFRva2VuOwotICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyB9Ci0gIGZpbmFsIHByaXZhdGUgTG9va2FoZWFkU3VjY2VzcyBqal9scyA9IG5ldyBMb29rYWhlYWRTdWNjZXNzKCk7Ci0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal9zY2FuX3Rva2VuKGludCBraW5kKSB7Ci0gICAgaWYgKGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgewotICAgICAgampfbGEtLTsKLSAgICAgIGlmIChqal9zY2FucG9zLm5leHQgPT0gbnVsbCkgewotICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OwotICAgIH0KLSAgICBpZiAoampfc2NhbnBvcy5raW5kICE9IGtpbmQpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9sYSA9PSAwICYmIGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgdGhyb3cgampfbHM7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIHsKLSAgICBpZiAodG9rZW4ubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgcmV0dXJuIHRva2VuOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFRva2VuIGdldFRva2VuKGludCBpbmRleCkgewotICAgIFRva2VuIHQgPSBsb29raW5nQWhlYWQgPyBqal9zY2FucG9zIDogdG9rZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0gICAgICBpZiAodC5uZXh0ICE9IG51bGwpIHQgPSB0Lm5leHQ7Ci0gICAgICBlbHNlIHQgPSB0Lm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBpbnQgampfbnRrKCkgewotICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKLSAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOwotICB9Ci0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKSB7Ci0gICAgVG9rZW4gZXJyb3J0b2sgPSB0b2tlbi5uZXh0OwotICAgIGludCBsaW5lID0gZXJyb3J0b2suYmVnaW5MaW5lLCBjb2x1bW4gPSBlcnJvcnRvay5iZWdpbkNvbHVtbjsKLSAgICBTdHJpbmcgbWVzcyA9IChlcnJvcnRvay5raW5kID09IDApID8gdG9rZW5JbWFnZVswXSA6IGVycm9ydG9rLmltYWdlOwotICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24oIlBhcnNlIGVycm9yIGF0IGxpbmUgIiArIGxpbmUgKyAiLCBjb2x1bW4gIiArIGNvbHVtbiArICIuICBFbmNvdW50ZXJlZDogIiArIG1lc3MpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZW5hYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBkaXNhYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXJDb25zdGFudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzQ1NzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2VsZWN0b3JQYXJzZXJDb25zdGFudHMuamF2YSAqLwotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2VsZWN0b3JQYXJzZXJDb25zdGFudHMgewotCi0gIGludCBFT0YgPSAwOwotICBpbnQgTElORV9DT01NRU5UID0gNjsKLSAgaW50IEJMT0NLX0NPTU1FTlQgPSA3OwotICBpbnQgTk9UID0gODsKLSAgaW50IEFORCA9IDk7Ci0gIGludCBPUiA9IDEwOwotICBpbnQgQkVUV0VFTiA9IDExOwotICBpbnQgTElLRSA9IDEyOwotICBpbnQgRVNDQVBFID0gMTM7Ci0gIGludCBJTiA9IDE0OwotICBpbnQgSVMgPSAxNTsKLSAgaW50IFRSVUUgPSAxNjsKLSAgaW50IEZBTFNFID0gMTc7Ci0gIGludCBOVUxMID0gMTg7Ci0gIGludCBYUEFUSCA9IDE5OwotICBpbnQgWFFVRVJZID0gMjA7Ci0gIGludCBERUNJTUFMX0xJVEVSQUwgPSAyMTsKLSAgaW50IEhFWF9MSVRFUkFMID0gMjI7Ci0gIGludCBPQ1RBTF9MSVRFUkFMID0gMjM7Ci0gIGludCBGTE9BVElOR19QT0lOVF9MSVRFUkFMID0gMjQ7Ci0gIGludCBFWFBPTkVOVCA9IDI1OwotICBpbnQgU1RSSU5HX0xJVEVSQUwgPSAyNjsKLSAgaW50IElEID0gMjc7Ci0KLSAgaW50IERFRkFVTFQgPSAwOwotCi0gIFN0cmluZ1tdIHRva2VuSW1hZ2UgPSB7Ci0gICAgIjxFT0Y+IiwKLSAgICAiXCIgXCIiLAotICAgICJcIlxcdFwiIiwKLSAgICAiXCJcXG5cIiIsCi0gICAgIlwiXFxyXCIiLAotICAgICJcIlxcZlwiIiwKLSAgICAiPExJTkVfQ09NTUVOVD4iLAotICAgICI8QkxPQ0tfQ09NTUVOVD4iLAotICAgICJcIk5PVFwiIiwKLSAgICAiXCJBTkRcIiIsCi0gICAgIlwiT1JcIiIsCi0gICAgIlwiQkVUV0VFTlwiIiwKLSAgICAiXCJMSUtFXCIiLAotICAgICJcIkVTQ0FQRVwiIiwKLSAgICAiXCJJTlwiIiwKLSAgICAiXCJJU1wiIiwKLSAgICAiXCJUUlVFXCIiLAotICAgICJcIkZBTFNFXCIiLAotICAgICJcIk5VTExcIiIsCi0gICAgIlwiWFBBVEhcIiIsCi0gICAgIlwiWFFVRVJZXCIiLAotICAgICI8REVDSU1BTF9MSVRFUkFMPiIsCi0gICAgIjxIRVhfTElURVJBTD4iLAotICAgICI8T0NUQUxfTElURVJBTD4iLAotICAgICI8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4iLAotICAgICI8RVhQT05FTlQ+IiwKLSAgICAiPFNUUklOR19MSVRFUkFMPiIsCi0gICAgIjxJRD4iLAotICAgICJcIj1cIiIsCi0gICAgIlwiPD5cIiIsCi0gICAgIlwiPlwiIiwKLSAgICAiXCI+PVwiIiwKLSAgICAiXCI8XCIiLAotICAgICJcIjw9XCIiLAotICAgICJcIihcIiIsCi0gICAgIlwiLFwiIiwKLSAgICAiXCIpXCIiLAotICAgICJcIitcIiIsCi0gICAgIlwiLVwiIiwKLSAgICAiXCIqXCIiLAotICAgICJcIi9cIiIsCi0gICAgIlwiJVwiIiwKLSAgfTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWQxZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlci5qYXZhICovCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXguam1zLkludmFsaWRTZWxlY3RvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYWN0aXZlbXEuZmlsdGVyLio7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlciBpbXBsZW1lbnRzIFNlbGVjdG9yUGFyc2VyQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyAgamF2YS5pby5QcmludFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IFN5c3RlbS5vdXQ7Ci0gIHB1YmxpYyAgdm9pZCBzZXREZWJ1Z1N0cmVhbShqYXZhLmlvLlByaW50U3RyZWFtIGRzKSB7IGRlYnVnU3RyZWFtID0gZHM7IH0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RvcEF0UG9zKGludCBwb3MsIGludCBraW5kKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICByZXR1cm4gcG9zICsgMTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKQotewotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDk6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMjsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgMTA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgMTI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gNTsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgMTM6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gNDsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgMzc6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gNDE7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDQwOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDM0OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA0MToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzNjsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNDI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDQzOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDM3OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA0NDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzNTsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNDU6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzg7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDQ3OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDQwOwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA2MDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzMjsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjIwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDI4OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA2MjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzMDsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwMDAwMDBMKTsKLSAgICAgIGNhc2UgNjU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMEwpOwotICAgICAgY2FzZSA2NjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwTCk7Ci0gICAgICBjYXNlIDY5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwTCk7Ci0gICAgICBjYXNlIDcwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwMEwpOwotICAgICAgY2FzZSA3MzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4YzAwMEwpOwotICAgICAgY2FzZSA3NjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMEwpOwotICAgICAgY2FzZSA3ODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAxMDBMKTsKLSAgICAgIGNhc2UgNzk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMEwpOwotICAgICAgY2FzZSA4NDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDBMKTsKLSAgICAgIGNhc2UgODg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDE4MDAwMEwpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwTCk7Ci0gICAgICBjYXNlIDk4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwTCk7Ci0gICAgICBjYXNlIDEwMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDBMKTsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhjMDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMTAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDBMKTsKLSAgICAgIGNhc2UgMTIwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxODAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMChsb25nIGFjdGl2ZTApCi17Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDMxOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzMzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMjk7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDY1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAwMEwpOwotICAgICAgY2FzZSA2OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDczOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwTCk7Ci0gICAgICBjYXNlIDc4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTQ7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDBMKTsKLSAgICAgIGNhc2UgNzk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMEwpOwotICAgICAgY2FzZSA4MDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKLSAgICAgIGNhc2UgODE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMEwpOwotICAgICAgY2FzZSA4MjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTA7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMEwpOwotICAgICAgY2FzZSA4MzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE1OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSA4NToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDAwMDBMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwMDAwTCk7Ci0gICAgICBjYXNlIDExMzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTA7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgMTE3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAxKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAxKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMSk7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgNjU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwTCk7Ci0gICAgICBjYXNlIDY3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDY4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA3NToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTAwMEwpOwotICAgICAgY2FzZSA3NjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4NjAwMDBMKTsKLSAgICAgIGNhc2UgODQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgODU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDExMDAwMEwpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKLSAgICAgIGNhc2UgOTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg2MDAwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgMTE3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMTAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMik7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMik7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDIpOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDY1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDY5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTY7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKLSAgICAgIGNhc2UgNzY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDgzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMEwpOwotICAgICAgY2FzZSA4NDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKLSAgICAgIGNhc2UgODc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNjsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDEwMDAwMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDAwMEwpOwotICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAzKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAzKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMyk7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgNjk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgNzI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTk7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDgwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDgyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxOTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTEyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDQpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDQpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCA0KTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA2OToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEzOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDg5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAyMDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDU7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTM7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA1OwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgMTIxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAyMDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDU7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgNSk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgNSk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDUpOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDc4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgNik7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGQoaW50IHN0YXRlKQotewotICAgaWYgKGpqcm91bmRzW3N0YXRlXSAhPSBqanJvdW5kKQotICAgewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gc3RhdGU7Ci0gICAgICBqanJvdW5kc1tzdGF0ZV0gPSBqanJvdW5kOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IGpqbmV4dFN0YXRlc1tzdGFydF07Ci0gICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRUd29TdGF0ZXMoaW50IHN0YXRlMSwgaW50IHN0YXRlMikKLXsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMSk7Ci0gICBqakNoZWNrTkFkZChzdGF0ZTIpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCkKLXsKLSAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0ICsgMV0pOwotfQotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzAgPSB7Ci0gICAweGZmZmZmZmZmZmZmZmZmZmVMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzIgPSB7Ci0gICAweDBMLCAweDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19OwotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpCi17Ci0gICBpbnQgc3RyS2luZCA9IGpqbWF0Y2hlZEtpbmQ7Ci0gICBpbnQgc3RyUG9zID0gamptYXRjaGVkUG9zOwotICAgaW50IHNlZW5VcHRvOwotICAgaW5wdXRfc3RyZWFtLmJhY2t1cChzZWVuVXB0byA9IGN1clBvcyArIDEpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBFcnJvciIpOyB9Ci0gICBjdXJQb3MgPSAwOwotICAgaW50W10gbmV4dFN0YXRlczsKLSAgIGludCBzdGFydHNBdCA9IDA7Ci0gICBqam5ld1N0YXRlQ250ID0gNDM7Ci0gICBpbnQgaSA9IDE7Ci0gICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKLSAgIGludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsKLSAgIGZvciAoOzspCi0gICB7Ci0gICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCi0gICAgICAgICBSZUluaXRSb3VuZHMoKTsKLSAgICAgIGlmIChjdXJDaGFyIDwgNjQpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCAzKTsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI3KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI3OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjcpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQsIDYpOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE3KTsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDcpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2OwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NSkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZlMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMTsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE0LCAxNSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ4KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMykKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMzsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDQwLCA0Mik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ1KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNywgOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmZmZmZkYmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNywgOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyNDAwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwICYmIGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEzKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg3LCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmYmZmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg3LCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMCwgMTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZjdiZmZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwLCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmJmZmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTAsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDcgJiYga2luZCA+IDcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ3KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmUwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjEpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjE7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxNCwgMTUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE0LCAxNSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjQpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjQ7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxNywgMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjQpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjQ7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0LCA2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmN2ZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQsIDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkgJiYga2luZCA+IDI2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gMzYpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAxMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDI5LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNDsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDMxLCAzMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI0KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI0OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzEsIDMyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI0KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI0OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDM1LCAzNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNDsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDM4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDQ4KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIzKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIzOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNDAsIDQyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjI7Ci0gICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA0MTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDcsIDkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg3LCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwLCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDAwMDEwMDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDIxKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxMywgMTQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNCwgNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE1LCAxNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE3LCAxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbnQgaGlCeXRlID0gKGludCkoY3VyQ2hhciA+PiA4KTsKLSAgICAgICAgIGludCBpMSA9IGhpQnl0ZSA+PiA2OwotICAgICAgICAgbG9uZyBsMSA9IDFMIDw8IChoaUJ5dGUgJiAwNzcpOwotICAgICAgICAgaW50IGkyID0gKGN1ckNoYXIgJiAweGZmKSA+PiA2OwotICAgICAgICAgbG9uZyBsMiA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg3LCA5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8wKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNywgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMCwgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg0LCA2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGlmIChraW5kICE9IDB4N2ZmZmZmZmYpCi0gICAgICB7Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IGN1clBvczsKLSAgICAgICAgIGtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgfQotICAgICAgKytjdXJQb3M7Ci0gICAgICBpZiAoKGkgPSBqam5ld1N0YXRlQ250KSA9PSAoc3RhcnRzQXQgPSA0MyAtIChqam5ld1N0YXRlQ250ID0gc3RhcnRzQXQpKSkKLSAgICAgICAgIGJyZWFrOwotICAgICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgYnJlYWs7IH0KLSAgIH0KLSAgIGlmIChqam1hdGNoZWRQb3MgPiBzdHJQb3MpCi0gICAgICByZXR1cm4gY3VyUG9zOwotCi0gICBpbnQgdG9SZXQgPSBNYXRoLm1heChjdXJQb3MsIHNlZW5VcHRvKTsKLQotICAgaWYgKGN1clBvcyA8IHRvUmV0KQotICAgICAgZm9yIChpID0gdG9SZXQgLSBNYXRoLm1pbihjdXJQb3MsIHNlZW5VcHRvKTsgaS0tID4gMDsgKQotICAgICAgICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICAgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBzZW5kIGEgYnVnIHJlcG9ydC4iKTsgfQotCi0gICBpZiAoamptYXRjaGVkUG9zIDwgc3RyUG9zKQotICAgewotICAgICAgamptYXRjaGVkS2luZCA9IHN0cktpbmQ7Ci0gICAgICBqam1hdGNoZWRQb3MgPSBzdHJQb3M7Ci0gICB9Ci0gICBlbHNlIGlmIChqam1hdGNoZWRQb3MgPT0gc3RyUG9zICYmIGpqbWF0Y2hlZEtpbmQgPiBzdHJLaW5kKQotICAgICAgamptYXRjaGVkS2luZCA9IHN0cktpbmQ7Ci0KLSAgIHJldHVybiB0b1JldDsKLX0KLXN0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7Ci0gICAyOSwgMzAsIDM1LCAzNiwgMjMsIDI0LCAyNSwgMSwgMiwgNCwgOCwgOSwgMTEsIDE5LCAyMCwgMzMsIAotICAgMzQsIDM3LCAzOCwgCi19OwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqakNhbk1vdmVfMChpbnQgaGlCeXRlLCBpbnQgaTEsIGludCBpMiwgbG9uZyBsMSwgbG9uZyBsMikKLXsKLSAgIHN3aXRjaChoaUJ5dGUpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzJbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGRlZmF1bHQgOiAKLSAgICAgICAgIGlmICgoampiaXRWZWMwW2kxXSAmIGwxKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotfQotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBqanN0ckxpdGVyYWxJbWFnZXMgPSB7Ci0iIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgCi1udWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAKLW51bGwsICJcNzUiLCAiXDc0XDc2IiwgIlw3NiIsICJcNzZcNzUiLCAiXDc0IiwgIlw3NFw3NSIsICJcNTAiLCAiXDU0IiwgIlw1MSIsICJcNTMiLCAKLSJcNTUiLCAiXDUyIiwgIlw1NyIsICJcNDUiLCB9OwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXhTdGF0ZU5hbWVzID0gewotICAgIkRFRkFVTFQiLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Ub2tlbiA9IHsKLSAgIDB4M2ZmZmRmZmZmMDFMLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Ta2lwID0gewotICAgMHhmZUwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1NwZWNpYWwgPSB7Ci0gICAweDNlTCwgCi19OwotcHJvdGVjdGVkIFNpbXBsZUNoYXJTdHJlYW0gaW5wdXRfc3RyZWFtOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanJvdW5kcyA9IG5ldyBpbnRbNDNdOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanN0YXRlU2V0ID0gbmV3IGludFs4Nl07Ci1wcm90ZWN0ZWQgY2hhciBjdXJDaGFyOwotcHVibGljIFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKQotewotICAgaWYgKFNpbXBsZUNoYXJTdHJlYW0uc3RhdGljRmxhZykKLSAgICAgIHRocm93IG5ldyBFcnJvcigiRVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLiIpOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotfQotcHVibGljIFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCi17Ci0gICB0aGlzKHN0cmVhbSk7Ci0gICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pCi17Ci0gICBqam1hdGNoZWRQb3MgPSBqam5ld1N0YXRlQ250ID0gMDsKLSAgIGN1ckxleFN0YXRlID0gZGVmYXVsdExleFN0YXRlOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotICAgUmVJbml0Um91bmRzKCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgUmVJbml0Um91bmRzKCkKLXsKLSAgIGludCBpOwotICAgampyb3VuZCA9IDB4ODAwMDAwMDE7Ci0gICBmb3IgKGkgPSA0MzsgaS0tID4gMDspCi0gICAgICBqanJvdW5kc1tpXSA9IDB4ODAwMDAwMDA7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKLXsKLSAgIFJlSW5pdChzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotcHVibGljIHZvaWQgU3dpdGNoVG8oaW50IGxleFN0YXRlKQotewotICAgaWYgKGxleFN0YXRlID49IDEgfHwgbGV4U3RhdGUgPCAwKQotICAgICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoIkVycm9yOiBJZ25vcmluZyBpbnZhbGlkIGxleGljYWwgc3RhdGUgOiAiICsgbGV4U3RhdGUgKyAiLiBTdGF0ZSB1bmNoYW5nZWQuIiwgVG9rZW5NZ3JFcnJvci5JTlZBTElEX0xFWElDQUxfU1RBVEUpOwotICAgZWxzZQotICAgICAgY3VyTGV4U3RhdGUgPSBsZXhTdGF0ZTsKLX0KLQotcHJvdGVjdGVkIFRva2VuIGpqRmlsbFRva2VuKCkKLXsKLSAgIFRva2VuIHQgPSBUb2tlbi5uZXdUb2tlbihqam1hdGNoZWRLaW5kKTsKLSAgIHQua2luZCA9IGpqbWF0Y2hlZEtpbmQ7Ci0gICBTdHJpbmcgaW0gPSBqanN0ckxpdGVyYWxJbWFnZXNbamptYXRjaGVkS2luZF07Ci0gICB0LmltYWdlID0gKGltID09IG51bGwpID8gaW5wdXRfc3RyZWFtLkdldEltYWdlKCkgOiBpbTsKLSAgIHQuYmVnaW5MaW5lID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luTGluZSgpOwotICAgdC5iZWdpbkNvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkNvbHVtbigpOwotICAgdC5lbmRMaW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKLSAgIHQuZW5kQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOwotICAgcmV0dXJuIHQ7Ci19Ci0KLWludCBjdXJMZXhTdGF0ZSA9IDA7Ci1pbnQgZGVmYXVsdExleFN0YXRlID0gMDsKLWludCBqam5ld1N0YXRlQ250OwotaW50IGpqcm91bmQ7Ci1pbnQgamptYXRjaGVkUG9zOwotaW50IGpqbWF0Y2hlZEtpbmQ7Ci0KLXB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSAKLXsKLSAgaW50IGtpbmQ7Ci0gIFRva2VuIHNwZWNpYWxUb2tlbiA9IG51bGw7Ci0gIFRva2VuIG1hdGNoZWRUb2tlbjsKLSAgaW50IGN1clBvcyA9IDA7Ci0KLSAgRU9GTG9vcCA6Ci0gIGZvciAoOzspCi0gIHsgICAKLSAgIHRyeSAgIAotICAgeyAgICAgCi0gICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLkJlZ2luVG9rZW4oKTsKLSAgIH0gICAgIAotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKQotICAgeyAgICAgICAgCi0gICAgICBqam1hdGNoZWRLaW5kID0gMDsKLSAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKLSAgIH0KLQotICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7Ci0gICBqam1hdGNoZWRQb3MgPSAwOwotICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOwotICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgIHsKLSAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQotICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKLSAgICAgIGlmICgoamp0b1Rva2VuW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCi0gICAgICB7Ci0gICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgICAgbWF0Y2hlZFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAoKGpqdG9TcGVjaWFsW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgICAgICAgaWYgKHNwZWNpYWxUb2tlbiA9PSBudWxsKQotICAgICAgICAgICAgICAgc3BlY2lhbFRva2VuID0gbWF0Y2hlZFRva2VuOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgICAgICAgIHNwZWNpYWxUb2tlbiA9IChzcGVjaWFsVG9rZW4ubmV4dCA9IG1hdGNoZWRUb2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBjb250aW51ZSBFT0ZMb29wOwotICAgICAgfQotICAgfQotICAgaW50IGVycm9yX2xpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgaW50IGVycm9yX2NvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKLSAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7Ci0gICBib29sZWFuIEVPRlNlZW4gPSBmYWxzZTsKLSAgIHRyeSB7IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOyB9Ci0gICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgewotICAgICAgRU9GU2VlbiA9IHRydWU7Ci0gICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7Ci0gICAgICAgICBlcnJvcl9saW5lKys7Ci0gICAgICAgICBlcnJvcl9jb2x1bW4gPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgZXJyb3JfY29sdW1uKys7Ci0gICB9Ci0gICBpZiAoIUVPRlNlZW4pIHsKLSAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgIH0KLSAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKEVPRlNlZW4sIGN1ckxleFN0YXRlLCBlcnJvcl9saW5lLCBlcnJvcl9jb2x1bW4sIGVycm9yX2FmdGVyLCBjdXJDaGFyLCBUb2tlbk1nckVycm9yLkxFWElDQUxfRVJST1IpOwotICB9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NpbXBsZUNoYXJTdHJlYW0uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NpbXBsZUNoYXJTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkNmE4ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TaW1wbGVDaGFyU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTaW1wbGVDaGFyU3RyZWFtLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBDaGFyU3RyZWFtLCB3aGVyZSB0aGUgc3RyZWFtIGlzIGFzc3VtZWQgdG8KLSAqIGNvbnRhaW4gb25seSBBU0NJSSBjaGFyYWN0ZXJzICh3aXRob3V0IHVuaWNvZGUgcHJvY2Vzc2luZykuCi0gKi8KLQotcHVibGljIGNsYXNzIFNpbXBsZUNoYXJTdHJlYW0KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0YXRpY0ZsYWcgPSBmYWxzZTsKLSAgaW50IGJ1ZnNpemU7Ci0gIGludCBhdmFpbGFibGU7Ci0gIGludCB0b2tlbkJlZ2luOwotICBwdWJsaWMgaW50IGJ1ZnBvcyA9IC0xOwotICBwcm90ZWN0ZWQgaW50IGJ1ZmxpbmVbXTsKLSAgcHJvdGVjdGVkIGludCBidWZjb2x1bW5bXTsKLQotICBwcm90ZWN0ZWQgaW50IGNvbHVtbiA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgbGluZSA9IDE7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNMRiA9IGZhbHNlOwotCi0gIHByb3RlY3RlZCBqYXZhLmlvLlJlYWRlciBpbnB1dFN0cmVhbTsKLQotICBwcm90ZWN0ZWQgY2hhcltdIGJ1ZmZlcjsKLSAgcHJvdGVjdGVkIGludCBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgaW5CdWYgPSAwOwotCi0gIHByb3RlY3RlZCB2b2lkIEV4cGFuZEJ1ZmYoYm9vbGVhbiB3cmFwQXJvdW5kKQotICB7Ci0gICAgIGNoYXJbXSBuZXdidWZmZXIgPSBuZXcgY2hhcltidWZzaXplICsgMjA0OF07Ci0gICAgIGludCBuZXdidWZsaW5lW10gPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKLSAgICAgaW50IG5ld2J1ZmNvbHVtbltdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07Ci0KLSAgICAgdHJ5Ci0gICAgIHsKLSAgICAgICAgaWYgKHdyYXBBcm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgbmV3YnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgMCwgbmV3YnVmY29sdW1uLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyArPSAoYnVmc2l6ZSAtIHRva2VuQmVnaW4pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyAtPSB0b2tlbkJlZ2luKTsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgewotICAgICAgICB0aHJvdyBuZXcgRXJyb3IodC5nZXRNZXNzYWdlKCkpOwotICAgICB9Ci0KLQotICAgICBidWZzaXplICs9IDIwNDg7Ci0gICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgIHRva2VuQmVnaW4gPSAwOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgRmlsbEJ1ZmYoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0gICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSBhdmFpbGFibGUpCi0gICAgIHsKLSAgICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmICh0b2tlbkJlZ2luID4gMjA0OCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSBpZiAodG9rZW5CZWdpbiA8IDApCi0gICAgICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBFeHBhbmRCdWZmKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdmFpbGFibGUgPiB0b2tlbkJlZ2luKQotICAgICAgICAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgICAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQotICAgICAgICAgICBFeHBhbmRCdWZmKHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47Ci0gICAgIH0KLQotICAgICBpbnQgaTsKLSAgICAgdHJ5IHsKLSAgICAgICAgaWYgKChpID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG1heE5leHRDaGFySW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIC0gbWF4TmV4dENoYXJJbmQpKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgKz0gaTsKLSAgICAgICAgcmV0dXJuOwotICAgICB9Ci0gICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAtLWJ1ZnBvczsKLSAgICAgICAgYmFja3VwKDApOwotICAgICAgICBpZiAodG9rZW5CZWdpbiA9PSAtMSkKLSAgICAgICAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKLSAgICAgICAgdGhyb3cgZTsKLSAgICAgfQotICB9Ci0KLSAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgdG9rZW5CZWdpbiA9IC0xOwotICAgICBjaGFyIGMgPSByZWFkQ2hhcigpOwotICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOwotCi0gICAgIHJldHVybiBjOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgVXBkYXRlTGluZUNvbHVtbihjaGFyIGMpCi0gIHsKLSAgICAgY29sdW1uKys7Ci0KLSAgICAgaWYgKHByZXZDaGFySXNMRikKLSAgICAgewotICAgICAgICBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKLSAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgIH0KLSAgICAgZWxzZSBpZiAocHJldkNoYXJJc0NSKQotICAgICB7Ci0gICAgICAgIHByZXZDaGFySXNDUiA9IGZhbHNlOwotICAgICAgICBpZiAoYyA9PSAnXG4nKQotICAgICAgICB7Ci0gICAgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICAgfQotCi0gICAgIHN3aXRjaCAoYykKLSAgICAgewotICAgICAgICBjYXNlICdccicgOgotICAgICAgICAgICBwcmV2Q2hhcklzQ1IgPSB0cnVlOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nIDoKLSAgICAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x0JyA6Ci0gICAgICAgICAgIGNvbHVtbi0tOwotICAgICAgICAgICBjb2x1bW4gKz0gKDggLSAoY29sdW1uICYgMDcpKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgIGJ1ZmxpbmVbYnVmcG9zXSA9IGxpbmU7Ci0gICAgIGJ1ZmNvbHVtbltidWZwb3NdID0gY29sdW1uOwotICB9Ci0KLSAgcHVibGljIGNoYXIgcmVhZENoYXIoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0gICAgIGlmIChpbkJ1ZiA+IDApCi0gICAgIHsKLSAgICAgICAgLS1pbkJ1ZjsKLQotICAgICAgICBpZiAoKytidWZwb3MgPT0gYnVmc2l6ZSkKLSAgICAgICAgICAgYnVmcG9zID0gMDsKLQotICAgICAgICByZXR1cm4gYnVmZmVyW2J1ZnBvc107Ci0gICAgIH0KLQotICAgICBpZiAoKytidWZwb3MgPj0gbWF4TmV4dENoYXJJbmQpCi0gICAgICAgIEZpbGxCdWZmKCk7Ci0KLSAgICAgY2hhciBjID0gYnVmZmVyW2J1ZnBvc107Ci0KLSAgICAgVXBkYXRlTGluZUNvbHVtbihjKTsKLSAgICAgcmV0dXJuIChjKTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICogQHNlZSAjZ2V0RW5kQ29sdW1uCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgewotICAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqIEBzZWUgI2dldEVuZExpbmUKLSAgICovCi0KLSAgcHVibGljIGludCBnZXRMaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRDb2x1bW4oKSB7Ci0gICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RW5kTGluZSgpIHsKLSAgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5Db2x1bW4oKSB7Ci0gICAgIHJldHVybiBidWZjb2x1bW5bdG9rZW5CZWdpbl07Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luTGluZSgpIHsKLSAgICAgcmV0dXJuIGJ1ZmxpbmVbdG9rZW5CZWdpbl07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBiYWNrdXAoaW50IGFtb3VudCkgewotCi0gICAgaW5CdWYgKz0gYW1vdW50OwotICAgIGlmICgoYnVmcG9zIC09IGFtb3VudCkgPCAwKQotICAgICAgIGJ1ZnBvcyArPSBidWZzaXplOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOwotICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGlmIChidWZmZXIgPT0gbnVsbCB8fCBidWZmZXJzaXplICE9IGJ1ZmZlci5sZW5ndGgpCi0gICAgewotICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKLSAgICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICB9Ci0gICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgIGJ1ZnBvcyA9IC0xOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgICBSZUluaXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgU3RyaW5nIEdldEltYWdlKCkKLSAgewotICAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmcG9zIC0gdG9rZW5CZWdpbiArIDEpOwotICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZwb3MgKyAxKTsKLSAgfQotCi0gIHB1YmxpYyBjaGFyW10gR2V0U3VmZml4KGludCBsZW4pCi0gIHsKLSAgICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07Ci0KLSAgICAgaWYgKChidWZwb3MgKyAxKSA+PSBsZW4pCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmc2l6ZSAtIChsZW4gLSBidWZwb3MgLSAxKSwgcmV0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1ZnBvcyAtIDEpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgcmV0LCBsZW4gLSBidWZwb3MgLSAxLCBidWZwb3MgKyAxKTsKLSAgICAgfQotCi0gICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBEb25lKCkKLSAgewotICAgICBidWZmZXIgPSBudWxsOwotICAgICBidWZsaW5lID0gbnVsbDsKLSAgICAgYnVmY29sdW1uID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gYWRqdXN0IGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGZvciB0aGUgc3RhcnQgb2YgYSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkanVzdEJlZ2luTGluZUNvbHVtbihpbnQgbmV3TGluZSwgaW50IG5ld0NvbCkKLSAgewotICAgICBpbnQgc3RhcnQgPSB0b2tlbkJlZ2luOwotICAgICBpbnQgbGVuOwotCi0gICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKLSAgICAgewotICAgICAgICBsZW4gPSBidWZwb3MgLSB0b2tlbkJlZ2luICsgaW5CdWYgKyAxOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBsZW4gPSBidWZzaXplIC0gdG9rZW5CZWdpbiArIGJ1ZnBvcyArIDEgKyBpbkJ1ZjsKLSAgICAgfQotCi0gICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOwotICAgICBpbnQgbmV4dENvbERpZmYgPSAwLCBjb2x1bW5EaWZmID0gMDsKLQotICAgICB3aGlsZSAoaSA8IGxlbiAmJgotICAgICAgICAgICAgYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSA9PSBidWZsaW5lW2sgPSArK3N0YXJ0ICUgYnVmc2l6ZV0pCi0gICAgIHsKLSAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICAgIG5leHRDb2xEaWZmID0gY29sdW1uRGlmZiArIGJ1ZmNvbHVtbltrXSAtIGJ1ZmNvbHVtbltqXTsKLSAgICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLSAgICAgICAgY29sdW1uRGlmZiA9IG5leHRDb2xEaWZmOwotICAgICAgICBpKys7Ci0gICAgIH0gCi0KLSAgICAgaWYgKGkgPCBsZW4pCi0gICAgIHsKLSAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKLSAgICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLQotICAgICAgICB3aGlsZSAoaSsrIDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmIChidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdICE9IGJ1ZmxpbmVbKytzdGFydCAlIGJ1ZnNpemVdKQotICAgICAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOwotICAgICAgICB9Ci0gICAgIH0KLQotICAgICBsaW5lID0gYnVmbGluZVtqXTsKLSAgICAgY29sdW1uID0gYnVmY29sdW1uW2pdOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1Rva2VuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ0ZWZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgotICovCi0KLXB1YmxpYyBjbGFzcyBUb2tlbiB7Ci0KLSAgLyoqCi0gICAqIEFuIGludGVnZXIgdGhhdCBkZXNjcmliZXMgdGhlIGtpbmQgb2YgdGhpcyB0b2tlbi4gIFRoaXMgbnVtYmVyaW5nCi0gICAqIHN5c3RlbSBpcyBkZXRlcm1pbmVkIGJ5IEphdmFDQ1BhcnNlciwgYW5kIGEgdGFibGUgb2YgdGhlc2UgbnVtYmVycyBpcwotICAgKiBzdG9yZWQgaW4gdGhlIGZpbGUgLi4uQ29uc3RhbnRzLmphdmEuCi0gICAqLwotICBwdWJsaWMgaW50IGtpbmQ7Ci0KLSAgLyoqCi0gICAqIGJlZ2luTGluZSBhbmQgYmVnaW5Db2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhpcyB0b2tlbjsgZW5kTGluZSBhbmQgZW5kQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUKLSAgICogbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uOwotCi0gIC8qKgotICAgKiBUaGUgc3RyaW5nIGltYWdlIG9mIHRoZSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgaW1hZ2U7Ci0KLSAgLyoqCi0gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbiBmcm9tIHRoZSBpbnB1dAotICAgKiBzdHJlYW0uICBJZiB0aGlzIGlzIHRoZSBsYXN0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3IgaWYgdGhlCi0gICAqIHRva2VuIG1hbmFnZXIgaGFzIG5vdCByZWFkIHRva2VucyBiZXlvbmQgdGhpcyBvbmUsIHRoaXMgZmllbGQgaXMKLSAgICogc2V0IHRvIG51bGwuICBUaGlzIGlzIHRydWUgb25seSBpZiB0aGlzIHRva2VuIGlzIGFsc28gYSByZWd1bGFyCi0gICAqIHRva2VuLiAgT3RoZXJ3aXNlLCBzZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCi0gICAqIHRoaXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gbmV4dDsKLQotICAvKioKLSAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGFjY2VzcyBzcGVjaWFsIHRva2VucyB0aGF0IG9jY3VyIHByaW9yIHRvIHRoaXMKLSAgICogdG9rZW4sIGJ1dCBhZnRlciB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbi4KLSAgICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggc3BlY2lhbCB0b2tlbnMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIG51bGwuCi0gICAqIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgc3VjaCBzcGVjaWFsIHRva2VuLCB0aGlzIGZpZWxkIHJlZmVycwotICAgKiB0byB0aGUgbGFzdCBvZiB0aGVzZSBzcGVjaWFsIHRva2Vucywgd2hpY2ggaW4gdHVybiByZWZlcnMgdG8gdGhlIG5leHQKLSAgICogcHJldmlvdXMgc3BlY2lhbCB0b2tlbiB0aHJvdWdoIGl0cyBzcGVjaWFsVG9rZW4gZmllbGQsIGFuZCBzbyBvbgotICAgKiB1bnRpbCB0aGUgZmlyc3Qgc3BlY2lhbCB0b2tlbiAod2hvc2Ugc3BlY2lhbFRva2VuIGZpZWxkIGlzIG51bGwpLgotICAgKiBUaGUgbmV4dCBmaWVsZHMgb2Ygc3BlY2lhbCB0b2tlbnMgcmVmZXIgdG8gb3RoZXIgc3BlY2lhbCB0b2tlbnMgdGhhdAotICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgaXQgKHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgcmVndWxhciB0b2tlbikuICBJZiB0aGVyZQotICAgKiBpcyBubyBzdWNoIHRva2VuLCB0aGlzIGZpZWxkIGlzIG51bGwuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gc3BlY2lhbFRva2VuOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFRva2VuIG9iamVjdCwgYnkgZGVmYXVsdC4gSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdQotICAgKiBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLgotICAgKiBTaW1wbHkgYWRkIHRoZSBjYXNlcyB0byB0aGUgc3dpdGNoIGZvciBhbGwgdGhvc2Ugc3BlY2lhbCBjYXNlcy4KLSAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc3ViY2xhc3Mgb2YgVG9rZW4gY2FsbGVkIElEVG9rZW4gdGhhdAotICAgKiB5b3Ugd2FudCB0byBjcmVhdGUgaWYgb2ZLaW5kIGlzIElELCBzaW1scHkgYWRkIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbigpOwotICAgKgotICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgotICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIGl0IGluIHlvdXIgbGV4aWNhbCBhY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kKQotICB7Ci0gICAgIHN3aXRjaChvZktpbmQpCi0gICAgIHsKLSAgICAgICBkZWZhdWx0IDogcmV0dXJuIG5ldyBUb2tlbigpOwotICAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvVG9rZW5NZ3JFcnJvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvVG9rZW5NZ3JFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI3NDU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1Rva2VuTWdyRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuTWdyRXJyb3IuamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUb2tlbk1nckVycm9yIGV4dGVuZHMgRXJyb3IKLXsKLSAgIC8qCi0gICAgKiBPcmRpbmFscyBmb3IgdmFyaW91cyByZWFzb25zIHdoeSBhbiBFcnJvciBvZiB0aGlzIHR5cGUgY2FuIGJlIHRocm93bi4KLSAgICAqLwotCi0gICAvKioKLSAgICAqIExleGljYWwgZXJyb3Igb2NjdXJlZC4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBMRVhJQ0FMX0VSUk9SID0gMDsKLQotICAgLyoqCi0gICAgKiBBbiBhdHRlbXB0IHdhc3MgbWFkZSB0byBjcmVhdGUgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgYSBzdGF0aWMgdG9rZW4gbWFuYWdlci4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTEVYRVJfRVJST1IgPSAxOwotCi0gICAvKioKLSAgICAqIFRyaWVkIHRvIGNoYW5nZSB0byBhbiBpbnZhbGlkIGxleGljYWwgc3RhdGUuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFID0gMjsKLQotICAgLyoqCi0gICAgKiBEZXRlY3RlZCAoYW5kIGJhaWxlZCBvdXQgb2YpIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIHRva2VuIG1hbmFnZXIuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9ERVRFQ1RFRCA9IDM7Ci0KLSAgIC8qKgotICAgICogSW5kaWNhdGVzIHRoZSByZWFzb24gd2h5IHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBJdCB3aWxsIGhhdmUKLSAgICAqIG9uZSBvZiB0aGUgYWJvdmUgNCB2YWx1ZXMuCi0gICAgKi8KLSAgIGludCBlcnJvckNvZGU7Ci0KLSAgIC8qKgotICAgICogUmVwbGFjZXMgdW5wcmludGFibGUgY2hhcmFjdGVycyBieSB0aGVpciBlc3BhY2VkIChvciB1bmljb2RlIGVzY2FwZWQpCi0gICAgKiBlcXVpdmFsZW50cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAgKi8KLSAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGFkZEVzY2FwZXMoU3RyaW5nIHN0cikgewotICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGNoYXIgY2g7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgewotICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogUmV0dXJucyBhIGRldGFpbGVkIG1lc3NhZ2UgZm9yIHRoZSBFcnJvciB3aGVuIGl0IGlzIHRocm93biBieSB0aGUKLSAgICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgotICAgICogUGFyYW1ldGVycyA6IAotICAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNsIGVycm9yCi0gICAgKiAgICBjdXJMZXhTdGF0ZSA6IGxleGljYWwgc3RhdGUgaW4gd2hpY2ggdGhpcyBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckxpbmUgICA6IGxpbmUgbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckFmdGVyICA6IHByZWZpeCB0aGF0IHdhcyBzZWVuIGJlZm9yZSB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGN1cmNoYXIgICAgIDogdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIKLSAgICAqIE5vdGU6IFlvdSBjYW4gY3VzdG9taXplIHRoZSBsZXhpY2FsIGVycm9yIG1lc3NhZ2UgYnkgbW9kaWZ5aW5nIHRoaXMgbWV0aG9kLgotICAgICovCi0gICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBMZXhpY2FsRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhcikgewotICAgICAgcmV0dXJuKCJMZXhpY2FsIGVycm9yIGF0IGxpbmUgIiArCi0gICAgICAgICAgIGVycm9yTGluZSArICIsIGNvbHVtbiAiICsKLSAgICAgICAgICAgZXJyb3JDb2x1bW4gKyAiLiAgRW5jb3VudGVyZWQ6ICIgKwotICAgICAgICAgICAoRU9GU2VlbiA/ICI8RU9GPiAiIDogKCJcIiIgKyBhZGRFc2NhcGVzKFN0cmluZy52YWx1ZU9mKGN1ckNoYXIpKSArICJcIiIpICsgIiAoIiArIChpbnQpY3VyQ2hhciArICIpLCAiKSArCi0gICAgICAgICAgICJhZnRlciA6IFwiIiArIGFkZEVzY2FwZXMoZXJyb3JBZnRlcikgKyAiXCIiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBZb3UgY2FuIGFsc28gbW9kaWZ5IHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIG1lc3NhZ2VzLgotICAgICogRm9yIGV4YW1wbGUsIGNhc2VzIGxpa2UgTE9PUF9ERVRFQ1RFRCBhbmQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFIGFyZSBub3QKLSAgICAqIG9mIGVuZC11c2VycyBjb25jZXJuLCBzbyB5b3UgY2FuIHJldHVybiBzb21ldGhpbmcgbGlrZSA6IAotICAgICoKLSAgICAqICAgICAiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgLi4uLiAiCi0gICAgKgotICAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgotICAgICovCi0gICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICAgfQotCi0gICAvKgotICAgICogQ29uc3RydWN0b3JzIG9mIHZhcmlvdXMgZmxhdm9ycyBmb2xsb3cuCi0gICAgKi8KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoKSB7Ci0gICB9Ci0KLSAgIHB1YmxpYyBUb2tlbk1nckVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgcmVhc29uKSB7Ci0gICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKLSAgIH0KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhciwgaW50IHJlYXNvbikgewotICAgICAgdGhpcyhMZXhpY2FsRXJyb3IoRU9GU2VlbiwgbGV4U3RhdGUsIGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIGVycm9yQWZ0ZXIsIGN1ckNoYXIpLCByZWFzb24pOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9MSUNFTlNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9OT1RJQ0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmYxY2M3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0JICAgCi0tLT4KLTxwcm9qZWN0Ci0gIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBKYXZhc2NyaXB0IFBsdWdpbjwvbmFtZT4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qYXZhY2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICAgIDxzb3VyY2VQYXRoPm9yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlcjwvc291cmNlUGF0aD4KLSAgICAgICAgICA8b3V0cHV0UGF0aD5vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXI8L291dHB1dFBhdGg+Ci0gICAgICAgICAgPGlzU3RhdGljPmZhbHNlPC9pc1N0YXRpYz4KLSAgICAgICAgICA8ZG9Ob3RHZW5lcmF0ZVRva2VuRmlsZT50cnVlPC9kb05vdEdlbmVyYXRlVG9rZW5GaWxlPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPmdlbmVyYXRlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8IS0tCi0gICAgICAgICAgLSBPdmVycmlkZSBjaGVja3N0eWxlIGNvbmZpZyBmaWxlIGRlZmluaXRpb25zIGZyb20gcGFyZW50IHBvbS4gVGhlIHNvdXJjZSBvZgotICAgICAgICAgIC0gdGhpcyBwcm9qZWN0IGlzIG5vdCBjb21wbGlhbnQgd2l0aCB0aGUgbm9ybWFsIE15RmFjZXMgY29kZSBzdHlsZSBydWxlcywgYW5kCi0gICAgICAgICAgLSBwcm9iYWJseSBuZXZlciB3aWxsIGJlLgotICAgICAgICAgIC0tPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLW1pbmltYWwueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci1zcGFjZXMudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L09iZnVzY2F0ZUphdmFzY3JpcHRNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L09iZnVzY2F0ZUphdmFzY3JpcHRNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjBjZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9PYmZ1c2NhdGVKYXZhc2NyaXB0TW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0OwotCi0vL34tLS0gbm9uLUpESyBpbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5PYmZ1c2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb24uQ29uZmlnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb24uT2JmdXNjYXRvckNvbmZpZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8vfi0tLSBKREsgaW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLy9+LS0tIGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIG9iZnVzY2F0ZS1qYXZhc2NyaXB0Ci0gKiBAcGhhc2UgZ2VuZXJhdGUtcmVzb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBvYmZ1c2NhdGVzIHRoZSBKYXZhc2NyaXB0IHNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIE9iZnVzY2F0ZUphdmFzY3JpcHRNb2pvCi0gIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0KLSAgLy9+LS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotLy8gTGlzdCBjb21waWxlU291cmNlUm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyBjb21waWxlU291cmNlUm9vdHMuYWRkKHNvdXJjZURpcmVjdG9yeSk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBfb2JmdXNjYXRvciA9IAotICAgICAgICAgIG5ldyBPYmZ1c2NhdG9yKG9iZnVzY2F0ZSwgc3RyaXBDb21tZW50cywgc3RyaXBXaGl0ZXNwYWNlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBOZXdsaW5lcywgc3RyaXBTcGVjaWFsS2V5d29yZHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VDaGFyTGl0ZXJhbHMsIG9iZnVzY2F0b3JDb25maWcpOwotCi0vLyAgICAgIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLQotICAgICAgdGFyZ2V0RGlyZWN0b3J5Lm1rZGlycygpOwotCi0gICAgICBmb3IgKEZpbGUgc291cmNlUm9vdDogc291cmNlRGlyZWN0b3J5KQotICAgICAgewotLy8gICAgICAgIEZpbGUgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoc291cmNlUm9vdCwgc291cmNlUGF0aCk7Ci0gICAgICAgIGlmIChzb3VyY2VSb290LmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgX29iZnVzY2F0b3IucHJvY2Vzcyhzb3VyY2VSb290LCB0YXJnZXREaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChDb25maWdFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiSW52YWxpZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgIH0KLSAgfQotICBwcml2YXRlIE9iZnVzY2F0b3IgX29iZnVzY2F0b3I7Ci0KLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBvYmZ1c2NhdGUgPSBmYWxzZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZXBsYWNlQ2hhckxpdGVyYWxzID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc3RyaXBDb21tZW50cyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHN0cmlwTmV3bGluZXMgPSBmYWxzZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzdHJpcFNwZWNpYWxLZXl3b3JkcyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHN0cmlwV2hpdGVzcGFjZXMgPSBmYWxzZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciAKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSBzb3VyY2VEaXJlY3Rvcnk7Ci0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIE9iZnVzY2F0b3JDb25maWcgb2JmdXNjYXRvckNvbmZpZzsKLX0KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9SZWR1Y2VKYXZhc2NyaXB0TW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9SZWR1Y2VKYXZhc2NyaXB0TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI2MWQ5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvUmVkdWNlSmF2YXNjcmlwdE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzLlJlZHVjZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCByZWR1Y2UtamF2YXNjcmlwdAotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqIEBkZXNjcmlwdGlvbiBHb2FsIHdoaWNoIGNvbXBpbGVzIHRoZSBKYXZhc2NyaXB0IHNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIFJlZHVjZUphdmFzY3JpcHRNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgTGlzdCBjb21waWxlU291cmNlUm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgY29tcGlsZVNvdXJjZVJvb3RzLmFkZChzb3VyY2VEaXJlY3RvcnkpOwotICAgIC8vIFRPRE86IHJlZ2lzdGVyIHRoZXNlIHBhdGhzIGZyb20gaW5zaWRlIHJlbGV2YW50IHBsdWdpbnMKLSAgICBjb21waWxlU291cmNlUm9vdHMuYWRkKG5ldyBGaWxlKHByb2plY3QuZ2V0QnVpbGQoKS5nZXREaXJlY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXZlbi1pMThuLXBsdWdpbi9tYWluL2phdmFzY3JpcHQiKSk7Ci0gICAgY29tcGlsZVNvdXJjZVJvb3RzLmFkZChuZXcgRmlsZShwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0RGlyZWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vamF2YXNjcmlwdCIpKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7Ci0gICAgICByZXNvdXJjZS5zZXREaXJlY3RvcnkodGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICBwcm9qZWN0LmFkZFJlc291cmNlKHJlc291cmNlKTsKLQotICAgICAgLy8gVE9ETzogc3dpdGNoIE9wdGltaXplZCwgbm90IERlYnVnLCB0byBiZSB0aGUgc3BlY2lhbC1jYXNlCi0gICAgICAvLyAgICAgICBzbyB0aGF0IERlYnVnIGNhbiBiZSBwcm9jZXNzZWQgYXMgb3JkaW5hcnkgcmVzb3VyY2UgY29weQotICAgICAgLy8gICAgICAgd2l0aG91dCBoYXZpbmcgdG8gZXhwbGljaXRseSBjb2RlIGl0IGhlcmUKLSAgICAgIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLSAgICAgIG91dHB1dERpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbXBpbGVTb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBGaWxlIHNvdXJjZVJvb3QgPSAoRmlsZSlpLm5leHQoKTsKLSAgICAgICAgRmlsZSBzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShzb3VyY2VSb290LCBzb3VyY2VQYXRoKTsKLSAgICAgICAgaWYgKHNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIF9jb3B5SmF2YXNjcmlwdChzb3VyY2VEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNvcHlpbmcgSmF2YXNjcmlwdCBmaWxlcyIsIGUpOwotICAgIH0KLQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKG9wdGltaXplVGFyZ2V0UGF0aCAhPSBudWxsKQotICAgICAgewotICAgICAgICBGaWxlIG91dHB1dERpcmVjdG9yeSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgb3B0aW1pemVUYXJnZXRQYXRoKTsKLSAgICAgICAgb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb21waWxlU291cmNlUm9vdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIEZpbGUgc291cmNlUm9vdCA9IChGaWxlKWkubmV4dCgpOwotICAgICAgICAgIEZpbGUgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoc291cmNlUm9vdCwgc291cmNlUGF0aCk7Ci0gICAgICAgICAgaWYgKHNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0geyBzb3VyY2VEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSB9OwotICAgICAgICAgICAgLy8gVE9ETzogaW5jcmVtZW50YWwgY2hlY2sKLSAgICAgICAgICAgIFJlZHVjZXIubWFpbihhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNvbXBpbGluZyBKYXZhc2NyaXB0IGZpbGVzIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgdm9pZCBfY29weUphdmFzY3JpcHQoRmlsZSBzb3VyY2VEaXIsIEZpbGUgdGFyZ2V0RGlyKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdIHNvdXJjZUZpbGVzID0gc291cmNlRGlyLmxpc3RGaWxlcygpOwotICAgIGlmIChzb3VyY2VGaWxlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoRmlsZSBzb3VyY2VGaWxlIDogc291cmNlRmlsZXMpCi0gICAgICB7Ci0gICAgICAgIGlmIChzb3VyY2VGaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlIHRhcmdldFN1YmRpciA9IG5ldyBGaWxlKHRhcmdldERpciwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgIGlmICghdGFyZ2V0U3ViZGlyLmV4aXN0cygpKQotICAgICAgICAgICAgdGFyZ2V0U3ViZGlyLm1rZGlyKCk7Ci0gICAgICAgICAgX2NvcHlKYXZhc2NyaXB0KHNvdXJjZUZpbGUsIHRhcmdldFN1YmRpcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc291cmNlRmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qcyIpKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3Rvcnkoc291cmNlRmlsZSwgdGFyZ2V0RGlyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YXNjcmlwdCIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgc291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgc291cmNlUGF0aDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1qYXZhc2NyaXB0LXBsdWdpbi9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0YXJnZXRQYXRoOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBvcHRpbWl6ZVRhcmdldFBhdGg7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZE9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBZGRPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjIyYmNmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZE9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQWRkT3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBZGRPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQWRkT3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBZGRpdGl2ZUV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZGl0aXZlRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjNlN2Y3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZGl0aXZlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBZGRpdGl2ZUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBZGRpdGl2ZUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBZGRpdGl2ZUV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEFkZGl0aXZlRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFubm90YXRhYmxlRGlyZWN0aXZlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBbm5vdGF0YWJsZURpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTkwNmRmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFubm90YXRhYmxlRGlyZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFubm90YXRhYmxlRGlyZWN0aXZlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBcmd1bWVudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFyZ3VtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE1MmM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBcmd1bWVudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBcmd1bWVudHMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBcmd1bWVudHMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEFyZ3VtZW50cyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFycmF5TGl0ZXJhbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXJyYXlMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWRkNDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXJyYXlMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFycmF5TGl0ZXJhbC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFycmF5TGl0ZXJhbCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFycmF5TGl0ZXJhbChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQXJyYXlMaXRlcmFsKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWduZW1lbnRPcGVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWduZW1lbnRPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODY3ZTJkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFzc2lnbmVtZW50T3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXNzaWduZW1lbnRPcGVyYXRvci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFzc2lnbmVtZW50T3BlcmF0b3IgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBc3NpZ25lbWVudE9wZXJhdG9yKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBc3NpZ25lbWVudE9wZXJhdG9yKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFzc2lnbm1lbnRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OWZlN2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWY4YTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXR0cmlidXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3NDY3OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXR0cmlidXRlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXR0cmlidXRlIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQXR0cmlidXRlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBdHRyaWJ1dGUoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTdhOTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXR0cmlidXRlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBdHRyaWJ1dGVFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXR0cmlidXRlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYmY0ZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBdHRyaWJ1dGVzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXR0cmlidXRlcyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEF0dHJpYnV0ZXMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEF0dHJpYnV0ZXMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZUFOREV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1MTJjOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZUFOREV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmNmFhNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ET3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzVhMzEzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlQU5ET3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlQU5ET3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlQU5ET3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VBTkRPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZDVhOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VPUkV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZU9SRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZU9SRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTkyNmZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZU9ST3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwYTA2NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlT1JPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VPUk9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZU9ST3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VPUk9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VYT1JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODE0MzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZVhPUkV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWQzOGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUk9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9ST3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1OTczMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9ST3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZVhPUk9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZVhPUk9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZVhPUk9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlWE9ST3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCbG9jay5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExN2M2NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCbG9jay5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJsb2NrIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQmxvY2soaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJsb2NrKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQnJlYWtTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJyZWFrU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjllMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQnJlYWtTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQnJlYWtTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCcmVha1N0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJyZWFrU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCcmVha1N0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDYXNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZThkMjAzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENhc2VFbGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2FzZUVsZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDYXNlRWxlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2FzZUVsZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDYXNlRWxlbWVudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjg4NTk4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RDYXNlRWxlbWVudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDYXNlRWxlbWVudHMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDYXNlRWxlbWVudHMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVENhc2VFbGVtZW50cyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VMYWJlbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWE3NTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENhc2VMYWJlbC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVENhc2VMYWJlbCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVENhc2VMYWJlbChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2FzZUxhYmVsKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2xhc3NEZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDbGFzc0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNmEzYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDbGFzc0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQ2xhc3NEZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2xhc3NEZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQ2xhc3NEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RDbGFzc0RlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzY4ZTJjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2ZTRlMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbnRpbnVlU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDb250aW51ZVN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2YxOWM0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbnRpbnVlU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENvbnRpbnVlU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ29udGludWVTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDb250aW51ZVN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ29udGludWVTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1REaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMzMTMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1REaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1REaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1REaXJlY3RpdmUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVERpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOGExNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1REaXJlY3RpdmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVERpcmVjdGl2ZXMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1REaXJlY3RpdmVzIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURGlyZWN0aXZlcyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURGlyZWN0aXZlcyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERvU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1REb1N0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTI2NzRhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERvU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVERvU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURG9TdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1REb1N0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURG9TdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFbGVtZW50TGlzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURWxlbWVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2NTdkMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFbGVtZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFbGVtZW50TGlzdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVsZW1lbnRMaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURWxlbWVudExpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEVsZW1lbnRMaXN0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURW1wdHlTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVtcHR5U3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNmJmYmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURW1wdHlTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURW1wdHlTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFbXB0eVN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEVtcHR5U3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFbXB0eVN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVvbENvbW1lbnRTa2lwV3MuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVvbENvbW1lbnRTa2lwV3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlMjBjNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFb2xDb21tZW50U2tpcFdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEVvbENvbW1lbnRTa2lwV3MuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFb2xDb21tZW50U2tpcFdzIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURW9sQ29tbWVudFNraXBXcyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURW9sQ29tbWVudFNraXBXcyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsT3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwOGI1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFcXVhbE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEVxdWFsT3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFcXVhbE9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURXF1YWxPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzE4NGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE0NzA4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzNmMGFmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXhwb3J0QmluZGluZy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEV4cG9ydEJpbmRpbmcgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFeHBvcnRCaW5kaW5nKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFeHBvcnRCaW5kaW5nKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZ0xpc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydEJpbmRpbmdMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGRiY2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZ0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXhwb3J0QmluZGluZ0xpc3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFeHBvcnRCaW5kaW5nTGlzdCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEV4cG9ydEJpbmRpbmdMaXN0KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFeHBvcnRCaW5kaW5nTGlzdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydERlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzYTYzOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHBvcnREZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cG9ydERlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFeHBvcnREZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURXhwb3J0RGVmaW5pdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwb3J0RGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQzYzVmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHByZXNzaW9uU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHByZXNzaW9uU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzdlNDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFeHByZXNzaW9uU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvblN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGaWVsZExpc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZpZWxkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE4MjcxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZpZWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGaWVsZExpc3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGaWVsZExpc3QgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGaWVsZExpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZpZWxkTGlzdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZpZWxkTmFtZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURmllbGROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmQ1NDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURmllbGROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZpZWxkTmFtZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZpZWxkTmFtZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZpZWxkTmFtZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURmllbGROYW1lKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURm9ySW5CaW5kaW5nLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMzEyOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbkJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURm9ySW5CaW5kaW5nLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURm9ySW5CaW5kaW5nIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURm9ySW5CaW5kaW5nKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGb3JJbkJpbmRpbmcoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbml0aWFsaXplci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURm9ySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkZDg2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGb3JJbml0aWFsaXplci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZvckluaXRpYWxpemVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURm9ySW5pdGlhbGl6ZXIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZvckluaXRpYWxpemVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURm9yU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5OTFkOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURm9yU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURm9yU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURm9yU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGb3JTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsTmV3RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbE5ld0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NTliMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsTmV3RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdWxsTmV3RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bGxOZXdFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVsbE5ld0V4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bGxOZXdFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbE5ld1N1YmV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bGxOZXdTdWJleHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODBiNGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbE5ld1N1YmV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVsbE5ld1N1YmV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bGxOZXdTdWJleHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmE5MDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25Db21tb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uQ29tbW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOTA2NDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25Db21tb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVuY3Rpb25Db21tb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdW5jdGlvbkNvbW1vbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bmN0aW9uQ29tbW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkNvbW1vbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uQ29uc3RydWN0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uQ29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExODEyOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bmN0aW9uQ29uc3RydWN0b3IuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdW5jdGlvbkNvbnN0cnVjdG9yIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVuY3Rpb25Db25zdHJ1Y3RvcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVuY3Rpb25Db25zdHJ1Y3RvcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uRGVmaW5pdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2I4ZWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bmN0aW9uRGVmaW5pdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bmN0aW9uRGVmaW5pdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVuY3Rpb25EZWZpbml0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25FeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MzczOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVuY3Rpb25FeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURnVuY3Rpb25FeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVuY3Rpb25FeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbk5hbWUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzIzNTMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbk5hbWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdW5jdGlvbk5hbWUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGdW5jdGlvbk5hbWUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uTmFtZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElkZW50aWZpZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlYjZjMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVElkZW50aWZpZXIuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJZGVudGlmaWVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUSWRlbnRpZmllcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSWRlbnRpZmllcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElmU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJZlN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2QwNTExLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElmU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVElmU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUSWZTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJZlN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSWZTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbXBvcnREaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEltcG9ydERpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU1OWQwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEltcG9ydERpcmVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbXBvcnREaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbXBvcnREaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJbXBvcnREaXJlY3RpdmUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEltcG9ydERpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluY2x1ZGVEaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluY2x1ZGVEaXJlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2YTBmMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbmNsdWRlRGlyZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEluY2x1ZGVEaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbmNsdWRlRGlyZWN0aXZlIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUSW5jbHVkZURpcmVjdGl2ZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSW5jbHVkZURpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluaGVyaXRhbmNlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbmhlcml0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjYzYmZjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluaGVyaXRhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEluaGVyaXRhbmNlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUSW5oZXJpdGFuY2UgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJbmhlcml0YW5jZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSW5oZXJpdGFuY2UoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbnRlcmZhY2VEZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbnRlcmZhY2VEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmYzNzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW50ZXJmYWNlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbnRlcmZhY2VEZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEludGVyZmFjZURlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEludGVyZmFjZURlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMYWJlbGVkU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMYWJlbGVkU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDlkN2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGFiZWxlZFN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMYWJlbGVkU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGFiZWxlZFN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVExhYmVsZWRTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExhYmVsZWRTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGlzdEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZjA2Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMaXN0RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExpc3RFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGlzdEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExpc3RFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGlzdEV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkYzQ5OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTGlzdEV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGlzdEV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGlzdEV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RMaXN0RXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRWxlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGl0ZXJhbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwN2RjYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMaXRlcmFsRWxlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExpdGVyYWxFbGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGl0ZXJhbEVsZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExpdGVyYWxFbGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGl0ZXJhbEZpZWxkLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMGNmMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTGl0ZXJhbEZpZWxkLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGl0ZXJhbEZpZWxkIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGl0ZXJhbEZpZWxkKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RMaXRlcmFsRmllbGQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbEFOREV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MzdkNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTG9naWNhbEFOREV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZDllMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzU3N2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbE9SRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMb2dpY2FsT1JFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTG9naWNhbE9SRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxYzdmNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsT3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE11bE9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDM0ZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTXVsT3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RNdWxPcCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE11bE9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RNdWxPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWNiYzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTmFtZXNwYWNlRGVmaW5pdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTmFtZXNwYWNlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU1MjBhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE5hbWVzcGFjZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTmFtZXNwYWNlRGVmaW5pdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE5hbWVzcGFjZURlZmluaXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1ROYW1lc3BhY2VEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1ROYW1lc3BhY2VEZWZpbml0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTVjMjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDFhOTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUT2JqZWN0TGl0ZXJhbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUT2JqZWN0TGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNkMTM3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE9iamVjdExpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUT2JqZWN0TGl0ZXJhbC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE9iamVjdExpdGVyYWwgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RPYmplY3RMaXRlcmFsKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RPYmplY3RMaXRlcmFsKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZURlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhY2thZ2VEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Y2M2ZDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFja2FnZURlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQYWNrYWdlRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhY2thZ2VEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYWNrYWdlRGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhY2thZ2VJZGVudGlmaWVycy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZUlkZW50aWZpZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWY1NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZUlkZW50aWZpZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFBhY2thZ2VJZGVudGlmaWVycy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhY2thZ2VJZGVudGlmaWVycyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhY2thZ2VJZGVudGlmaWVycyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUGFja2FnZUlkZW50aWZpZXJzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZU5hbWUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhY2thZ2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmNkZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFja2FnZU5hbWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQYWNrYWdlTmFtZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhY2thZ2VOYW1lKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYWNrYWdlTmFtZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhcmFtZXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzgwNjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFBhcmFtZXRlci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhcmFtZXRlciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhcmFtZXRlcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUGFyYW1ldGVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVySW5pdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVySW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWUzYTQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhcmFtZXRlckluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFyYW1ldGVySW5pdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhcmFtZXRlckluaXQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJJbml0KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJJbml0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVycy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWIyY2I1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFyYW1ldGVycy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhcmFtZXRlcnMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBvc3RmaXhFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZmQ0OWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUG9zdGZpeEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQb3N0Zml4RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBvc3RmaXhFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQb3N0Zml4RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBvc3RmaXhPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeE9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjJlODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFBvc3RmaXhPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBvc3RmaXhPcCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBvc3RmaXhPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUG9zdGZpeE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwN2VmMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJhZ21hIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJhZ21hKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWEoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFBcmd1bWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hQXJndW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwNzRlNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFBcmd1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcmFnbWFBcmd1bWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFByYWdtYUFyZ3VtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJhZ21hQXJndW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByYWdtYUFyZ3VtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hRXhwci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hRXhwci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFlMTgxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUV4cHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hRXhwci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFByYWdtYUV4cHIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmFnbWFFeHByKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWFFeHByKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU2MTViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hSXRlbS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFByYWdtYUl0ZW0gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmFnbWFJdGVtKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWFJdGVtKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUl0ZW1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTE2N2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hSXRlbXMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQcmFnbWFJdGVtcyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByYWdtYUl0ZW1zKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWFJdGVtcyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByaW1hcnlFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmltYXJ5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBlNzE5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByaW1hcnlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFByaW1hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJpbWFyeUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmltYXJ5RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUHJpbWFyeUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9ncmFtLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9ncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YWM3NWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJvZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcm9ncmFtLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJvZ3JhbSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByb2dyYW0oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByb2dyYW0oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9wZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGRlNGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJvcGVydHlPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcm9wZXJ0eU9wZXJhdG9yLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJvcGVydHlPcGVyYXRvciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByb3BlcnR5T3BlcmF0b3IoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByb3BlcnR5T3BlcmF0b3IoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9yQXJndW1lbnRzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9yQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGU3ZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJvcGVydHlPckFyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcm9wZXJ0eU9yQXJndW1lbnRzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJvcGVydHlPckFyZ3VtZW50cyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByb3BlcnR5T3JBcmd1bWVudHMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByb3BlcnR5T3JBcmd1bWVudHMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTc5YTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUXVhbGlmaWVkSWRlbnRpZmllciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFF1YWxpZmllZElkZW50aWZpZXIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFF1YWxpZmllZElkZW50aWZpZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxNDc1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RSZWxPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJlbE9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUmVsT3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlbE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjNiNzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTFhZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzZXJ2ZWROYW1lc3BhY2UuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc2VydmVkTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzZiZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzZXJ2ZWROYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVzZXJ2ZWROYW1lc3BhY2UuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RSZXNlcnZlZE5hbWVzcGFjZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlc2VydmVkTmFtZXNwYWNlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZXNlcnZlZE5hbWVzcGFjZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3RQYXJhbWV0ZXJzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXN0UGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWIzZGRiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3RQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJlc3RQYXJhbWV0ZXJzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVzdFBhcmFtZXRlcnMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RSZXN0UGFyYW1ldGVycyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmVzdFBhcmFtZXRlcnMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXN1bHQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZhMWJmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RSZXN1bHQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RSZXN1bHQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RSZXN1bHQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlc3VsdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJldHVyblN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmV0dXJuU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjgzMDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmV0dXJuU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJldHVyblN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJldHVyblN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJldHVyblN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmV0dXJuU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2MuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZjRjZmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2MuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLkpTUGFyc2VyMjBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlci5Ub2tlbjsKLQotcHVibGljIGNsYXNzIEFTVFNjIGV4dGVuZHMgU2ltcGxlTm9kZSBpbXBsZW1lbnRzIEpTUGFyc2VyMjBDb25zdGFudHMKLXsKLSAgcHVibGljIEFTVFNjKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTYyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNoaWZ0RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NWUwMWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFNoaWZ0RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFNoaWZ0RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFNoaWZ0RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU2hpZnRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUzYmVmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNoaWZ0T3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2hpZnRPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFNoaWZ0T3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTaGlmdE9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTaGlmdE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdiNjIwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmYzBmYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OThmZjhmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1YnN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjE2MDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFN1YnN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFN1YnN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFN1YnN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3Vic3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk1NDI1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1YnN0YXRlbWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU3Vic3RhdGVtZW50cy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFN1YnN0YXRlbWVudHMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTdWJzdGF0ZW1lbnRzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTdWJzdGF0ZW1lbnRzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3VwZXJFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlckV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0MWExYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU3VwZXJFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU3VwZXJFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU3VwZXJFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTdXBlckV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlclN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3VwZXJTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0Yzg2ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlclN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTdXBlclN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFN1cGVyU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU3VwZXJTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN1cGVyU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3dpdGNoU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTd2l0Y2hTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyYjEwNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTd2l0Y2hTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU3dpdGNoU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU3dpdGNoU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU3dpdGNoU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTd2l0Y2hTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUaHJvd1N0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVGhyb3dTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0OThlNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUaHJvd1N0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUaHJvd1N0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFRocm93U3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVGhyb3dTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFRocm93U3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHJ5U3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUcnlTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmM2Q5Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUcnlTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVHJ5U3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVHJ5U3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVHJ5U3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RUcnlTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiNjU4OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUeXBlRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFR5cGVFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVHlwZUV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFR5cGVFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZUV4cHJlc3Npb25MaXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3ODI4Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVHlwZUV4cHJlc3Npb25MaXN0LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVHlwZUV4cHJlc3Npb25MaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVHlwZUV4cHJlc3Npb25MaXN0KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RUeXBlRXhwcmVzc2lvbkxpc3QoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRlYzJiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUeXBlRXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RUeXBlRXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUeXBlRXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFR5cGVFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVkSWRlbnRpZmllci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODhhODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFR5cGVkSWRlbnRpZmllci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFR5cGVkSWRlbnRpZmllciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFR5cGVkSWRlbnRpZmllcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVHlwZWRJZGVudGlmaWVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFlZmEwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVkSWRlbnRpZmllck5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVHlwZWRJZGVudGlmaWVyTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFR5cGVkSWRlbnRpZmllck5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUeXBlZElkZW50aWZpZXJOb0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RUeXBlZElkZW50aWZpZXJOb0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjYmM0ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVW5hcnlFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVW5hcnlFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVbmFyeUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzdhYmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiZjVkZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVXNlRGlyZWN0aXZlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVc2VEaXJlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhOWYxNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVc2VEaXJlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVXNlRGlyZWN0aXZlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVXNlRGlyZWN0aXZlIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVXNlRGlyZWN0aXZlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVc2VEaXJlY3RpdmUoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmcuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzUxNWQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUJpbmRpbmcuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUJpbmRpbmcgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUJpbmRpbmcoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5OTI2ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTGlzdChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTGlzdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVkNDI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdOb0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdOb0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTA4ODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUJpbmRpbmdOb0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVCaW5kaW5nTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZ05vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZ05vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZURlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgxZmU4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZURlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZURlZmluaXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZURlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlRGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhNjg2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZURlZmluaXRpb25LaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5NjU0Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0YTM2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNjYmM5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMWYzYjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUluaXRpYWxpemVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVJbml0aWFsaXplciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzYjQ5OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUV2hpbGVTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFdoaWxlU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjY0YzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUV2hpbGVTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUV2hpbGVTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RXaGlsZVN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFdoaWxlU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RXaGlsZVN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFdpdGhTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFdpdGhTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ODEwYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RXaXRoU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFdpdGhTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RXaXRoU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUV2l0aFN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUV2l0aFN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pKVEpTUGFyc2VyMjBTdGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSkpUSlNQYXJzZXIyMFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmNiNDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSkpUSlNQYXJzZXIyMFN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiAuXEpKVEpTUGFyc2VyMjBTdGF0ZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotY2xhc3MgSkpUSlNQYXJzZXIyMFN0YXRlCi17Ci0gIHByaXZhdGUgamF2YS51dGlsLlN0YWNrIG5vZGVzOwotICBwcml2YXRlIGphdmEudXRpbC5TdGFjayBtYXJrczsKLQotICBwcml2YXRlIGludCAgICAgc3A7Ly8gbnVtYmVyIG9mIG5vZGVzIG9uIHN0YWNrCi0gIHByaXZhdGUgaW50ICAgICBtazsvLyBjdXJyZW50IG1hcmsKLSAgcHJpdmF0ZSBib29sZWFuIG5vZGVfY3JlYXRlZDsKLQotICBKSlRKU1BhcnNlcjIwU3RhdGUoKQotICB7Ci0gICAgbm9kZXMgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgbWFya3MgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBub2RlIHdhcyBhY3R1YWxseSBjbG9zZWQgYW5kCi0gICAgIHB1c2hlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBmaW5hbCB1c2VyIGFjdGlvbiBvZiBhCi0gICAgIG5vZGUgc2NvcGUuICAqLwotICBib29sZWFuIG5vZGVDcmVhdGVkKCkKLSAgewotICAgIHJldHVybiBub2RlX2NyZWF0ZWQ7Ci0gIH0KLQotICAvKiBDYWxsIHRoaXMgdG8gcmVpbml0aWFsaXplIHRoZSBub2RlIHN0YWNrLiAgSXQgaXMgY2FsbGVkCi0gICAgIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBhcnNlcidzIFJlSW5pdCgpIG1ldGhvZC4gKi8KLSAgdm9pZCByZXNldCgpCi0gIHsKLSAgICBub2Rlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIG1hcmtzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgQVNULiAgSXQgb25seSBtYWtlcyBzZW5zZSB0byBjYWxsCi0gICAgIHRoaXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhcnNlLiAqLwotICBOb2RlIHJvb3ROb2RlKCkKLSAgewotICAgIHJldHVybiAoTm9kZSkgbm9kZXMuZWxlbWVudEF0KDApOwotICB9Ci0KLSAgLyogUHVzaGVzIGEgbm9kZSBvbiB0byB0aGUgc3RhY2suICovCi0gIHZvaWQgcHVzaE5vZGUoTm9kZSBuKQotICB7Ci0gICAgbm9kZXMucHVzaChuKTsKLSAgICArK3NwOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgbm9kZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZQotICAgICBzdGFjay4gICovCi0gIE5vZGUgcG9wTm9kZSgpCi0gIHsKLQotICAgIGlmICgtLXNwIDwgbWspCi0gICAgewotICAgICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHJldHVybiAoTm9kZSkgbm9kZXMucG9wKCk7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIGN1cnJlbnRseSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gKi8KLSAgTm9kZSBwZWVrTm9kZSgpCi0gIHsKLSAgICByZXR1cm4gKE5vZGUpIG5vZGVzLnBlZWsoKTsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvbiB0aGUgc3RhY2sgaW4gdGhlIGN1cnJlbnQgbm9kZQotICAgICBzY29wZS4gKi8KLSAgaW50IG5vZGVBcml0eSgpCi0gIHsKLSAgICByZXR1cm4gc3AgLSBtazsKLSAgfQotCi0KLSAgdm9pZCBjbGVhck5vZGVTY29wZShOb2RlIG4pCi0gIHsKLQotICAgIHdoaWxlIChzcCA+IG1rKQotICAgIHsKLSAgICAgIHBvcE5vZGUoKTsKLSAgICB9Ci0KLSAgICBtayA9ICgoSW50ZWdlcikgbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gIH0KLQotCi0gIHZvaWQgb3Blbk5vZGVTY29wZShOb2RlIG4pCi0gIHsKLSAgICBtYXJrcy5wdXNoKG5ldyBJbnRlZ2VyKG1rKSk7Ci0gICAgbWsgPSBzcDsKLSAgICBuLmpqdE9wZW4oKTsKLSAgfQotCi0KLSAgLyogQSBkZWZpbml0ZSBub2RlIGlzIGNvbnN0cnVjdGVkIGZyb20gYSBzcGVjaWZpZWQgbnVtYmVyIG9mCi0gICAgIGNoaWxkcmVuLiAgVGhhdCBudW1iZXIgb2Ygbm9kZXMgYXJlIHBvcHBlZCBmcm9tIHRoZSBzdGFjayBhbmQKLSAgICAgbWFkZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlZmluaXRlIG5vZGUuICBUaGVuIHRoZSBkZWZpbml0ZSBub2RlCi0gICAgIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2suICovCi0gIHZvaWQgY2xvc2VOb2RlU2NvcGUoTm9kZSBuLCBpbnQgbnVtKQotICB7Ci0gICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotCi0gICAgd2hpbGUgKG51bS0tID4gMCkKLSAgICB7Ci0gICAgICBOb2RlIGMgPSBwb3BOb2RlKCk7Ci0gICAgICBjLmpqdFNldFBhcmVudChuKTsKLSAgICAgIG4uamp0QWRkQ2hpbGQoYywgbnVtKTsKLSAgICB9Ci0KLSAgICBuLmpqdENsb3NlKCk7Ci0gICAgcHVzaE5vZGUobik7Ci0gICAgbm9kZV9jcmVhdGVkID0gdHJ1ZTsKLSAgfQotCi0KLSAgLyogQSBjb25kaXRpb25hbCBub2RlIGlzIGNvbnN0cnVjdGVkIGlmIGl0cyBjb25kaXRpb24gaXMgdHJ1ZS4gIEFsbAotICAgICB0aGUgbm9kZXMgdGhhdCBoYXZlIGJlZW4gcHVzaGVkIHNpbmNlIHRoZSBub2RlIHdhcyBvcGVuZWQgYXJlCi0gICAgIG1hZGUgY2hpbGRyZW4gb2YgdGhlIHRoZSBjb25kaXRpb25hbCBub2RlLCB3aGljaCBpcyB0aGVuIHB1c2hlZAotICAgICBvbiB0byB0aGUgc3RhY2suICBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBub2RlIGlzIG5vdAotICAgICBjb25zdHJ1Y3RlZCBhbmQgdGhleSBhcmUgbGVmdCBvbiB0aGUgc3RhY2suICovCi0gIHZvaWQgY2xvc2VOb2RlU2NvcGUoTm9kZSBuLCBib29sZWFuIGNvbmRpdGlvbikKLSAgewotCi0gICAgaWYgKGNvbmRpdGlvbikKLSAgICB7Ci0gICAgICBpbnQgYSA9IG5vZGVBcml0eSgpOwotICAgICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotCi0gICAgICB3aGlsZSAoYS0tID4gMCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBjID0gcG9wTm9kZSgpOwotICAgICAgICBjLmpqdFNldFBhcmVudChuKTsKLSAgICAgICAgbi5qanRBZGRDaGlsZChjLCBhKTsKLSAgICAgIH0KLQotICAgICAgbi5qanRDbG9zZSgpOwotICAgICAgcHVzaE5vZGUobik7Ci0gICAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgICAgbm9kZV9jcmVhdGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MTUzNGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQxMCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BhcnNlcjIwLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1wdWJsaWMgY2xhc3MgSlNQYXJzZXIyMC8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BhcnNlcjIwVHJlZUNvbnN0YW50cywgSlNQYXJzZXIyMENvbnN0YW50cyB7LypAYmdlbihqanRyZWUpKi8KLSAgcHJvdGVjdGVkIEpKVEpTUGFyc2VyMjBTdGF0ZSBqanRyZWUgPSBuZXcgSkpUSlNQYXJzZXIyMFN0YXRlKCk7Ly8KLSAgICAvLyBUaGlzIGlzIHRoZSByb290IG5vZGUgZm9yIHRoZSBwYXJzZSB0cmVlIChyb290IERPTSBub2RlLCB0cmVlIG9mIFNpbXBsZU5vZGUocykpCi0gICAgLy8KLSAgICBwcm90ZWN0ZWQgQVNUUHJvZ3JhbSBfamp0Um9vdDsKLQotICAgIHB1YmxpYyBBU1RQcm9ncmFtIGdldFJvb3ROb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfamp0Um9vdDsKLSAgICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEdSQU1NQVIgU2VjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgVG9rZW4gUHJvZ3JhbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByb2dyYW0gKi8KLSAgICAgICAgQVNUUHJvZ3JhbSBqanRuMDAwID0gbmV3IEFTVFByb2dyYW0odGhpcywgSkpUUFJPR1JBTSk7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHJldHZhbCA9IGdldFRva2VuKDEpOwotICAgIHRyeSB7Ci0gICAgICBsYWJlbF8xOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUEFDS0FHRToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzBdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzE7Ci0gICAgICAgIH0KLSAgICAgICAgUGFja2FnZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBCUkVBSzoKLSAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgIGNhc2UgREVMRVRFOgotICAgICAgY2FzZSBETzoKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZPUjoKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSUY6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFJFVFVSTjoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgU1dJVENIOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUSFJPVzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFJZOgotICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICBjYXNlIFVTRToKLSAgICAgIGNhc2UgVkFSOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBXSElMRToKLSAgICAgIGNhc2UgV0lUSDoKLSAgICAgIGNhc2UgRVhQT1JUOgotICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBEaXJlY3RpdmVzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzFdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKDApOwotICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICBfamp0Um9vdCA9IGpqdG4wMDA7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXR2YWw7fQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwcmVzc2lvbnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSWRlbnRpZmllciAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBJZGVudGlmaWVyICovCi0gIEFTVElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RJZGVudGlmaWVyKHRoaXMsIEpKVElERU5USUZJRVIpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oR0VUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTRVQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTkNMVURFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMl0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUXVhbGlmaWVkIElkZW50aWZpZXIgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciAqLwotICBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcih0aGlzLCBKSlRTSU1QTEVRVUFMSUZJRURJREVOVElGSUVSKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBRVUFMSUZJRVI6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihRVUFMSUZJRVIpOwotICAgICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbM10gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgUmVzZXJ2ZWROYW1lc3BhY2UoKTsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUVVBTElGSUVSOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUVVBTElGSUVSKTsKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzRdID0gampfZ2VuOwotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs1XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgKi8KLSAgQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcih0aGlzLCBKSlRFWFBSRVNTSU9OUVVBTElGSUVESURFTlRJRklFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgampfY29uc3VtZV90b2tlbihRVUFMSUZJRVIpOwotICAgICAgSWRlbnRpZmllcigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFF1YWxpZmllZElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBRdWFsaWZpZWRJZGVudGlmaWVyICovCi0gIEFTVFF1YWxpZmllZElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RRdWFsaWZpZWRJZGVudGlmaWVyKHRoaXMsIEpKVFFVQUxJRklFRElERU5USUZJRVIpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs2XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUHJpbWFyeSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcmltYXJ5RXhwcmVzc2lvbiAqLwotICBBU1RQcmltYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFByaW1hcnlFeHByZXNzaW9uKHRoaXMsIEpKVFBSSU1BUllFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBOVUxMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZBTFNFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUNJTUFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihPQ1RBTF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhFWF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSElTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRISVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJFR1VMQVJfRVhQUkVTU0lPTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIEFycmF5TGl0ZXJhbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICBPYmplY3RMaXRlcmFsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzddID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgIHRva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlc2VydmVkTmFtZXNwYWNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUmVzZXJ2ZWROYW1lc3BhY2UgKi8KLSAgQVNUUmVzZXJ2ZWROYW1lc3BhY2Ugamp0bjAwMCA9IG5ldyBBU1RSZXNlcnZlZE5hbWVzcGFjZSh0aGlzLCBKSlRSRVNFUlZFRE5BTUVTUEFDRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBVQkxJQyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFJPVEVDVEVEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFJJVkFURSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzhdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZ1bmN0aW9uIEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bmN0aW9uRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bmN0aW9uRXhwcmVzc2lvbiAqLwotICBBU1RGdW5jdGlvbkV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkV4cHJlc3Npb24odGhpcywgSkpURlVOQ1RJT05FWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzEoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGVU5DVElPTik7Ci0gICAgICAgIEZ1bmN0aW9uQ29tbW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZVTkNUSU9OKTsKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgRnVuY3Rpb25Db21tb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBPYmplY3QgTGl0ZXJhbHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE9iamVjdExpdGVyYWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBPYmplY3RMaXRlcmFsICovCi0gIEFTVE9iamVjdExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RPYmplY3RMaXRlcmFsKHRoaXMsIEpKVE9CSkVDVExJVEVSQUwpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBGaWVsZExpc3QoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTBdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZpZWxkTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZpZWxkTGlzdCAqLwotICBBU1RGaWVsZExpc3Qgamp0bjAwMCA9IG5ldyBBU1RGaWVsZExpc3QodGhpcywgSkpURklFTERMSVNUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExpdGVyYWxGaWVsZCgpOwotICAgICAgbGFiZWxfMjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIExpdGVyYWxGaWVsZCgpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXRlcmFsRmllbGQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBMaXRlcmFsRmllbGQgKi8KLSAgQVNUTGl0ZXJhbEZpZWxkIGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbEZpZWxkKHRoaXMsIEpKVExJVEVSQUxGSUVMRCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBGaWVsZE5hbWUoKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRmllbGROYW1lKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRmllbGROYW1lICovCi0gIEFTVEZpZWxkTmFtZSBqanRuMDAwID0gbmV3IEFTVEZpZWxkTmFtZSh0aGlzLCBKSlRGSUVMRE5BTUUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUNJTUFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBRVUFMSUZJRVI6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihRVUFMSUZJRVIpOwotICAgICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTJdID0gampfZ2VuOwotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBcnJheSBMaXRlcmFsCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBBcnJheUxpdGVyYWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBcnJheUxpdGVyYWwgKi8KLSAgQVNUQXJyYXlMaXRlcmFsIGpqdG4wMDAgPSBuZXcgQVNUQXJyYXlMaXRlcmFsKHRoaXMsIEpKVEFSUkFZTElURVJBTCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDS0VUKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgVEhJUzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBFbGVtZW50TGlzdCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxNF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFbGVtZW50TGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEVsZW1lbnRMaXN0ICovCi0gIEFTVEVsZW1lbnRMaXN0IGpqdG4wMDAgPSBuZXcgQVNURWxlbWVudExpc3QodGhpcywgSkpURUxFTUVOVExJU1QpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTGl0ZXJhbEVsZW1lbnQoKTsKLSAgICAgIGxhYmVsXzM6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zOwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgICBMaXRlcmFsRWxlbWVudCgpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXRlcmFsRWxlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExpdGVyYWxFbGVtZW50ICovCi0gIEFTVExpdGVyYWxFbGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbEVsZW1lbnQodGhpcywgSkpUTElURVJBTEVMRU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdXBlciBFeHByZXNzaW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBTdXBlckV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTdXBlckV4cHJlc3Npb24gKi8KLSAgQVNUU3VwZXJFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUU3VwZXJFeHByZXNzaW9uKHRoaXMsIEpKVFNVUEVSRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFNVUEVSKTsKLSAgICAgIGlmIChqal8yXzIoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUG9zdGZpeCBFeHByZXNzaW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBQb3N0Zml4RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFBvc3RmaXhFeHByZXNzaW9uICovCi0gIEFTVFBvc3RmaXhFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUG9zdGZpeEV4cHJlc3Npb24odGhpcywgSkpUUE9TVEZJWEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgQXR0cmlidXRlRXhwcmVzc2lvbigpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgICAgUG9zdGZpeE9wKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE2XSA9IGpqX2dlbjsKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICB0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpOwotICAgICAgICBGdWxsUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgbGFiZWxfNDoKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIGNhc2UgRE9UOgotICAgICAgICAgICAgOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsxN10gPSBqal9nZW47Ci0gICAgICAgICAgICBicmVhayBsYWJlbF80OwotICAgICAgICAgIH0KLSAgICAgICAgICBQcm9wZXJ0eU9yQXJndW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgY2FzZSBERUNSOgotICAgICAgICAgIFBvc3RmaXhPcCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxOF0gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgU3VwZXJFeHByZXNzaW9uKCk7Ci0gICAgICAgIFByb3BlcnR5T3BlcmF0b3IoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTldID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEF0dHJpYnV0ZUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGVFeHByZXNzaW9uICovCi0gIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGVFeHByZXNzaW9uKHRoaXMsIEpKVEFUVFJJQlVURUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgbGFiZWxfNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyMF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eU9yQXJndW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiAqLwotICBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24odGhpcywgSkpURlVMTFBPU1RGSVhFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzMoMjE0NzQ4MzY0NykpIHsKLSAgICAgICAgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgUHJpbWFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgRnVsbE5ld0V4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMjFdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVsbE5ld0V4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdWxsTmV3RXhwcmVzc2lvbiAqLwotICBBU1RGdWxsTmV3RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bGxOZXdFeHByZXNzaW9uKHRoaXMsIEpKVEZVTExORVdFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkVXKTsKLSAgICAgIEZ1bGxOZXdTdWJleHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF82OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKGpqXzJfNCgyKSkgewotICAgICAgICAgIDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBicmVhayBsYWJlbF82OwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5T3BlcmF0b3IoKTsKLSAgICAgIH0KLSAgICAgIGlmIChqal8yXzUoMikpIHsKLSAgICAgICAgQXJndW1lbnRzKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bmN0aW9uQ29uc3RydWN0b3IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbnN0cnVjdG9yICovCi0gIEFTVEZ1bmN0aW9uQ29uc3RydWN0b3Igamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkNvbnN0cnVjdG9yKHRoaXMsIEpKVEZVTkNUSU9OQ09OU1RSVUNUT1IpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihGVU5DVElPTl8pOwotICAgICAgQXJndW1lbnRzKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bGxOZXdTdWJleHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRnVsbE5ld1N1YmV4cHJlc3Npb24gKi8KLSAgQVNURnVsbE5ld1N1YmV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbih0aGlzLCBKSlRGVUxMTkVXU1VCRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl82KDIxNDc0ODM2NDcpKSB7Ci0gICAgICAgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIFByaW1hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgICBTdXBlckV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgRnVsbE5ld0V4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGVU5DVElPTl86Ci0gICAgICAgICAgRnVuY3Rpb25Db25zdHJ1Y3RvcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyMl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUG9zdGZpeE9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeE9wICovCi0gIEFTVFBvc3RmaXhPcCBqanRuMDAwID0gbmV3IEFTVFBvc3RmaXhPcCh0aGlzLCBKSlRQT1NURklYT1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5DUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBERUNSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERFQ1IpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFByb3BlcnR5T3JBcmd1bWVudHMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9yQXJndW1lbnRzICovCi0gIEFTVFByb3BlcnR5T3JBcmd1bWVudHMgamp0bjAwMCA9IG5ldyBBU1RQcm9wZXJ0eU9yQXJndW1lbnRzKHRoaXMsIEpKVFBST1BFUlRZT1JBUkdVTUVOVFMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgQXJndW1lbnRzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgIGNhc2UgRE9UOgotICAgICAgICBQcm9wZXJ0eU9wZXJhdG9yKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzI0XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByb3BlcnR5IE9wZXJhdG9ycwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgUHJvcGVydHlPcGVyYXRvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByb3BlcnR5T3BlcmF0b3IgKi8KLSAgQVNUUHJvcGVydHlPcGVyYXRvciBqanRuMDAwID0gbmV3IEFTVFByb3BlcnR5T3BlcmF0b3IodGhpcywgSkpUUFJPUEVSVFlPUEVSQVRPUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRE9UOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7Ci0gICAgICAgIFF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMjZdID0gampfZ2VuOwotICAgICAgICBpZiAoampfMl83KDIpKSB7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoampfMl84KDIpKSB7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihFTElQU0UpOwotICAgICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOwotICAgICAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgICAgY2FzZSBFTElQU0U6Ci0gICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxJUFNFKTsKLSAgICAgICAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBqal9sYTFbMjVdID0gampfZ2VuOwotICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMjddID0gampfZ2VuOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQXJndW1lbnRzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQXJndW1lbnRzICovCi0gQVNUQXJndW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUQXJndW1lbnRzKHRoaXMsIEpKVEFSR1VNRU5UUyk7Ci0gYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTt7dG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7fQotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl85KDIpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgfSBlbHNlIGlmIChqal8yXzEwKDIpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihFTElQU0UpOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBFTElQU0U6Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVMSVBTRSk7Ci0gICAgICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsyOF0gPSBqal9nZW47Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMjldID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVW5hcnkgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgVW5hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovCi0gIEFTVFVuYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFVuYXJ5RXhwcmVzc2lvbih0aGlzLCBKSlRVTkFSWUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgVEhJUzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVMRVRFKTsKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVk9JRCk7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRZUEVPRik7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTkNSKTsKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVDUik7Ci0gICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQTFVTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBMVVMpOwotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE1JTlVTKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUSUxERSk7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihCQU5HKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzMwXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE11bHRpcGxpY2F0aXZlIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE11bE9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTXVsT3AgKi8KLSAgQVNUTXVsT3Agamp0bjAwMCA9IG5ldyBBU1RNdWxPcCh0aGlzLCBKSlRNVUxPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgU1RBUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVEFSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNMQVNIOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNMQVNIKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJFTToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSRU0pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVszMV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAqLwotICBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24odGhpcywgSkpUTVVMVElQTElDQVRJVkVFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFNUQVI6Ci0gICAgICAgIGNhc2UgU0xBU0g6Ci0gICAgICAgIGNhc2UgUkVNOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMzJdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzc7Ci0gICAgICAgIH0KLSAgICAgICAgTXVsT3AoKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQWRkaXRpdmUgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQWRkT3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBZGRPcCAqLwotICBBU1RBZGRPcCBqanRuMDAwID0gbmV3IEFTVEFkZE9wKHRoaXMsIEpKVEFERE9QKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBQTFVTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBMVVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVszM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFkZGl0aXZlRXhwcmVzc2lvbiAqLwotICBBU1RBZGRpdGl2ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBZGRpdGl2ZUV4cHJlc3Npb24odGhpcywgSkpUQURESVRJVkVFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfODoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszNF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfODsKLSAgICAgICAgfQotICAgICAgICBBZGRPcCgpOwotICAgICAgICBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCaXR3aXNlIFNoaWZ0IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFNoaWZ0T3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTaGlmdE9wICovCi0gIEFTVFNoaWZ0T3Agamp0bjAwMCA9IG5ldyBBU1RTaGlmdE9wKHRoaXMsIEpKVFNISUZUT1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExTSElGVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMU0hJRlQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUlNJR05FRFNISUZUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJTSUdORURTSElGVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSVU5TSUdORURTSElGVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSVU5TSUdORURTSElGVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzM1XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgU2hpZnRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU2hpZnRFeHByZXNzaW9uICovCi0gIEFTVFNoaWZ0RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFNoaWZ0RXhwcmVzc2lvbih0aGlzLCBKSlRTSElGVEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQWRkaXRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF85OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTFNISUZUOgotICAgICAgICBjYXNlIFJTSUdORURTSElGVDoKLSAgICAgICAgY2FzZSBSVU5TSUdORURTSElGVDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzM2XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF85OwotICAgICAgICB9Ci0gICAgICAgIFNoaWZ0T3AoKTsKLSAgICAgICAgQWRkaXRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUmVsYXRpb25hbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBSZWxPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlbE9wICovCi0gIEFTVFJlbE9wIGpqdG4wMDAgPSBuZXcgQVNUUmVsT3AodGhpcywgSkpUUkVMT1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEdUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEdFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElTKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFTKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMzddID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlbGF0aW9uYWxFeHByZXNzaW9uICovCi0gIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgU2hpZnRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xMDoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmIChqal8yXzExKDMpKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJyZWFrIGxhYmVsXzEwOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFTOgotICAgICAgICBjYXNlIElTOgotICAgICAgICBjYXNlIEdUOgotICAgICAgICBjYXNlIExUOgotICAgICAgICBjYXNlIExFOgotICAgICAgICBjYXNlIEdFOgotICAgICAgICAgIFJlbE9wKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU46Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihJTik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5TVEFOQ0VPRjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOU1RBTkNFT0YpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszOF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiAqLwotICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFNoaWZ0RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMTE6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBBUzoKLSAgICAgICAgY2FzZSBJTlNUQU5DRU9GOgotICAgICAgICBjYXNlIElTOgotICAgICAgICBjYXNlIEdUOgotICAgICAgICBjYXNlIExUOgotICAgICAgICBjYXNlIExFOgotICAgICAgICBjYXNlIEdFOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMzldID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzExOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFTOgotICAgICAgICBjYXNlIElTOgotICAgICAgICBjYXNlIEdUOgotICAgICAgICBjYXNlIExUOgotICAgICAgICBjYXNlIExFOgotICAgICAgICBjYXNlIEdFOgotICAgICAgICAgIFJlbE9wKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5TVEFOQ0VPRjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOU1RBTkNFT0YpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0MF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXF1YWxpdHkgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgRXF1YWxPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEVxdWFsT3AgKi8KLSAgQVNURXF1YWxPcCBqanRuMDAwID0gbmV3IEFTVEVxdWFsT3AodGhpcywgSkpURVFVQUxPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRVE6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVEpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTkU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSURFTlRJVFlPUEVSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USVRZT1BFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOT1RJREVOVElUWU9QRVI6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9USURFTlRJVFlPUEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNDFdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFcXVhbGl0eUV4cHJlc3Npb24gKi8KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKHRoaXMsIEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMTI6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBFUToKLSAgICAgICAgY2FzZSBORToKLSAgICAgICAgY2FzZSBJREVOVElUWU9QRVI6Ci0gICAgICAgIGNhc2UgTk9USURFTlRJVFlPUEVSOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNDJdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzEyOwotICAgICAgICB9Ci0gICAgICAgIEVxdWFsT3AoKTsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4odGhpcywgSkpURVFVQUxJVFlFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzEzOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRVE6Ci0gICAgICAgIGNhc2UgTkU6Ci0gICAgICAgIGNhc2UgSURFTlRJVFlPUEVSOgotICAgICAgICBjYXNlIE5PVElERU5USVRZT1BFUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQzXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xMzsKLSAgICAgICAgfQotICAgICAgICBFcXVhbE9wKCk7Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJpbmFyeSBCaXR3aXNlIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VBTkRPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRPcCAqLwotICBBU1RCaXR3aXNlQU5ET3Agamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlQU5ET3AodGhpcywgSkpUQklUV0lTRUFORE9QKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX0FORCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uICovCi0gIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFOREV4cHJlc3Npb24odGhpcywgSkpUQklUV0lTRUFOREVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xNDoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9BTkQ6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0NF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTQ7Ci0gICAgICAgIH0KLSAgICAgICAgQml0d2lzZUFORE9wKCk7Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8xNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9BTkQ6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0NV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTU7Ci0gICAgICAgIH0KLSAgICAgICAgQml0d2lzZUFORE9wKCk7Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZVhPUk9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZVhPUk9wICovCi0gIEFTVEJpdHdpc2VYT1JPcCBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JPcCh0aGlzLCBKSlRCSVRXSVNFWE9ST1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihYT1IpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9SRXhwcmVzc2lvbiAqLwotICBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VYT1JFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xNjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFhPUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ2XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xNjsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlWE9ST3AoKTsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOICovCi0gIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRCSVRXSVNFWE9SRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8xNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFhPUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ3XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xNzsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlWE9ST3AoKTsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VPUk9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9ST3AgKi8KLSAgQVNUQml0d2lzZU9ST3Agamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JPcCh0aGlzLCBKSlRCSVRXSVNFT1JPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEJJVF9PUik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9SRXhwcmVzc2lvbiAqLwotICBBU1RCaXR3aXNlT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9SRXhwcmVzc2lvbih0aGlzLCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xODoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9PUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ4XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xODsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlT1JPcCgpOwotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOICovCi0gIEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQklUV0lTRU9SRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8xOToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9PUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ5XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xOTsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlT1JPcCgpOwotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCaW5hcnkgTG9naWNhbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBMb2dpY2FsQU5ERXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExvZ2ljYWxBTkRFeHByZXNzaW9uICovCi0gIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTG9naWNhbEFOREV4cHJlc3Npb24odGhpcywgSkpUTE9HSUNBTEFOREVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjA6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBTQ19BTkQ6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1MF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjA7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19BTkQpOwotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiAqLwotICBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTE9HSUNBTEFOREVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8yMToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFNDX0FORDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzUxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yMTsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX0FORCk7Ci0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExvZ2ljYWxPUkV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uICovCi0gIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uKHRoaXMsIEpKVExPR0lDQUxPUkVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTG9naWNhbEFOREV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzIyOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgU0NfT1I6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1Ml0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjI7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19PUik7Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMT0dJQ0FMT1JFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzIzOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgU0NfT1I6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1M10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjM7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19PUik7Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbmRpdGlvbmFsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIENvbmRpdGlvbmFsRXhwcmVzc2lvbiAqLwotICBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNTRdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOICovCi0gIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVENPTkRJVElPTkFMRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs1NV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbiAqLwotICBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKHRoaXMsIEpKVE5PTkFTU0lHTk1FTlRFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNTZdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiAqLwotICBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSE9PSzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihIT09LKTsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNTddID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQXNzaWdubWVudCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBBc3NpZ25lbWVudE9wZXJhdG9yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQXNzaWduZW1lbnRPcGVyYXRvciAqLwotICBBU1RBc3NpZ25lbWVudE9wZXJhdG9yIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWduZW1lbnRPcGVyYXRvcih0aGlzLCBKSlRBU1NJR05FTUVOVE9QRVJBVE9SKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNUQVJBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RBUkFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTTEFTSEFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTTEFTSEFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSRU1BU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkVNQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBMVVNBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUExVU0FTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNSU5VU0FTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihNSU5VU0FTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMU0hJRlRBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFNISUZUQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSU0lHTkVEU0hJRlRBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUlVOU0lHTkVEU0hJRlRBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlVOU0lHTkVEU0hJRlRBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQU5EQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFOREFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYT1JBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oWE9SQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9SQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE9SQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNDX0FOREFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19BTkRBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0NfWE9SQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX1hPUkFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQ19PUkFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19PUkFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzU4XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQXNzaWdubWVudEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbiAqLwotICBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uKHRoaXMsIEpKVEFTU0lHTk1FTlRFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgaWYgKGpqXzJfMTIoMikpIHsKLSAgICAgICAgQXNzaWduZW1lbnRPcGVyYXRvcigpOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEFTU0lHTk1FTlRFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBpZiAoampfMl8xMygyKSkgewotICAgICAgICBBc3NpZ25lbWVudE9wZXJhdG9yKCk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbW1hIEV4cHJlc3Npb25zCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXN0RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uICovCi0gIEFTVExpc3RFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTGlzdEV4cHJlc3Npb24odGhpcywgSkpUTElTVEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzI0OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1OV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjQ7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExpc3RFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uTm9JTiAqLwotICBBU1RMaXN0RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMaXN0RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTElTVEVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgbGFiZWxfMjU6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzYwXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yNTsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVHlwZSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgVHlwZUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbiAqLwotICBBU1RUeXBlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uKHRoaXMsIEpKVFRZUEVFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFR5cGVFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTm9JTiAqLwotICBBU1RUeXBlRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RUeXBlRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUVFlQRUVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBUeXBlRXhwcmVzc2lvbkxpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbkxpc3QgKi8KLSAgQVNUVHlwZUV4cHJlc3Npb25MaXN0IGpqdG4wMDAgPSBuZXcgQVNUVHlwZUV4cHJlc3Npb25MaXN0KHRoaXMsIEpKVFRZUEVFWFBSRVNTSU9OTElTVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjY6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzYxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yNjsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdGFlbWVudHMgKGFiYnJldiwgbm9TaG9ydElmLCBmdWxsKSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN0YXRlbWVudCAqLwotICBBU1RTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTdGF0ZW1lbnQodGhpcywgSkpUU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzE0KDMpKSB7Ci0gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQoKTsKLSAgICAgICAgU2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgIFN1cGVyU3RhdGVtZW50KCk7Ci0gICAgICAgICAgU2MoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgICAgQmxvY2soKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBMYWJlbGVkU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUY6Ci0gICAgICAgICAgSWZTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTV0lUQ0g6Ci0gICAgICAgICAgU3dpdGNoU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRE86Ci0gICAgICAgICAgRG9TdGF0ZW1lbnQoKTsKLSAgICAgICAgICBTYygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdISUxFOgotICAgICAgICAgIFdoaWxlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9SOgotICAgICAgICAgIEZvclN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdJVEg6Ci0gICAgICAgICAgV2l0aFN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgICAgIENvbnRpbnVlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgU2MoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUkVBSzoKLSAgICAgICAgICBCcmVha1N0YXRlbWVudCgpOwotICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVUVVJOOgotICAgICAgICAgIFJldHVyblN0YXRlbWVudCgpOwotICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEhST1c6Ci0gICAgICAgICAgVGhyb3dTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBTYygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSWToKLSAgICAgICAgICBUcnlTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNjJdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFN1YnN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudCAqLwotICBBU1RTdWJzdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTdWJzdGF0ZW1lbnQodGhpcywgSkpUU1VCU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBTRU1JQ09MT046Ci0gICAgICAgIEVtcHR5U3RhdGVtZW50KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzYzXSA9IGpqX2dlbjsKLSAgICAgICAgaWYgKGpqXzJfMTUoMikpIHsKLSAgICAgICAgICBTdGF0ZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgICAgIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgU2MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgICAgICAgU3Vic3RhdGVtZW50cygpOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVs2NF0gPSBqal9nZW47Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgU3Vic3RhdGVtZW50cygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudHMgKi8KLSAgQVNUU3Vic3RhdGVtZW50cyBqanRuMDAwID0gbmV3IEFTVFN1YnN0YXRlbWVudHModGhpcywgSkpUU1VCU1RBVEVNRU5UUyk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBsYWJlbF8yNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBCUkVBSzoKLSAgICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgIGNhc2UgRE86Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgRk9SOgotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJRjoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFJFVFVSTjoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgIGNhc2UgU1dJVENIOgotICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGNhc2UgVEhST1c6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBUUlk6Ci0gICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICBjYXNlIFdISUxFOgotICAgICAgICBjYXNlIFdJVEg6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgY2FzZSBTRU1JQ09MT046Ci0gICAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzY1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yNzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIFNjKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgU2MgKi8KLSBBU1RTYyBqanRuMDAwID0gbmV3IEFTVFNjKHRoaXMsIEpKVFNDKTsKLSBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotIHRyeSB7VG9rZW4gdG9rID0gZ2V0VG9rZW4oMSk7Ci0gICAgaWYgKHRvay5raW5kID09IFNFTUlDT0xPTikgewotICAgICAgIHRvayA9IGdldE5leHRUb2tlbigpOwotICAgIH0gZWxzZSBpZiAodG9rLnNwZWNpYWxUb2tlbiAhPSBudWxsKSB7Ci0gICAgICAgaWYgKCFFb2xDb21tZW50U2tpcFdzKHRvay5zcGVjaWFsVG9rZW4pICYmICh0b2sua2luZCAhPSBFT0YpKSB7Ci0gICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCh0b2sua2luZCAhPSBFT0YpICYmICh0b2sua2luZCE9UkJSQUNFKSkgewotICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICAgIH0vKkBiZ2VuKGpqdHJlZSkqLwotIH0gZmluYWxseSB7Ci0gICBpZiAoamp0YzAwMCkgewotICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICB9Ci0gfQotICB9Ci0KLSAgYm9vbGVhbiBFb2xDb21tZW50U2tpcFdzKFRva2VuIHQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIEVvbENvbW1lbnRTa2lwV3MgKi8KLSBBU1RFb2xDb21tZW50U2tpcFdzIGpqdG4wMDAgPSBuZXcgQVNURW9sQ29tbWVudFNraXBXcyh0aGlzLCBKSlRFT0xDT01NRU5UU0tJUFdTKTsKLSBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotIHRyeSB7Ym9vbGVhbiByZXRWYWwgPSBmYWxzZTsKLSAgICBUb2tlbiBzcGVjaWFsVG9rZW4gPSB0OwotICAgIHdoaWxlKHNwZWNpYWxUb2tlbiAhPSBudWxsKSB7Ci0gICAgICBpZihzcGVjaWFsVG9rZW4ua2luZCA9PSBXUykgewotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gRU9MICB8fAotICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4ua2luZCA9PSBTSU5HTEVfTElORV9DT01NRU5UKSB7Ci0gICAgICAgIHJldFZhbCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0VmFsOy8qQGJnZW4oamp0cmVlKSovCi0gfSBmaW5hbGx5IHsKLSAgIGlmIChqanRjMDAwKSB7Ci0gICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgIH0KLSB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVtcHR5IFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEVtcHR5U3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRW1wdHlTdGF0ZW1lbnQgKi8KLSAgQVNURW1wdHlTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RFbXB0eVN0YXRlbWVudCh0aGlzLCBKSlRFTVBUWVNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEV4cHJlc2lvbiBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBFeHByZXNzaW9uU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvblN0YXRlbWVudCAqLwotICBBU1RFeHByZXNzaW9uU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNURXhwcmVzc2lvblN0YXRlbWVudCh0aGlzLCBKSlRFWFBSRVNTSU9OU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU3VwZXIgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgU3VwZXJTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTdXBlclN0YXRlbWVudCAqLwotICBBU1RTdXBlclN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN1cGVyU3RhdGVtZW50KHRoaXMsIEpKVFNVUEVSU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOwotICAgICAgQXJndW1lbnRzKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQmxvY2sgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQmxvY2soKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCbG9jayAqLwotICBBU1RCbG9jayBqanRuMDAwID0gbmV3IEFTVEJsb2NrKHRoaXMsIEpKVEJMT0NLKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBCUkVBSzoKLSAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgIGNhc2UgREVMRVRFOgotICAgICAgY2FzZSBETzoKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZPUjoKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSUY6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFJFVFVSTjoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgU1dJVENIOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUSFJPVzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFJZOgotICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICBjYXNlIFVTRToKLSAgICAgIGNhc2UgVkFSOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBXSElMRToKLSAgICAgIGNhc2UgV0lUSDoKLSAgICAgIGNhc2UgRVhQT1JUOgotICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBEaXJlY3RpdmVzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzY2XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExhYmVsZWQgU3RhdGVtZW50IChtYXBzIHRvIGxpdGVyYWwgZmllbGQpCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBMYWJlbGVkU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTGFiZWxlZFN0YXRlbWVudCAqLwotICBBU1RMYWJlbGVkU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUTGFiZWxlZFN0YXRlbWVudCh0aGlzLCBKSlRMQUJFTEVEU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSWYgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgSWZTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBJZlN0YXRlbWVudCAqLwotICBBU1RJZlN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVElmU3RhdGVtZW50KHRoaXMsIEpKVElGU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSUYpOwotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEVMU0U6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxTRSk7Ci0gICAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs2N10gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTd2l0Y2ggU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgU3dpdGNoU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU3dpdGNoU3RhdGVtZW50ICovCi0gIEFTVFN3aXRjaFN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN3aXRjaFN0YXRlbWVudCh0aGlzLCBKSlRTV0lUQ0hTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihTV0lUQ0gpOwotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDQVNFOgotICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgQ2FzZUVsZW1lbnRzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzY4XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBDYXNlRWxlbWVudHMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDYXNlRWxlbWVudHMgKi8KLSAgQVNUQ2FzZUVsZW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUVsZW1lbnRzKHRoaXMsIEpKVENBU0VFTEVNRU5UUyk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBDYXNlTGFiZWwoKTsKLSAgICAgIGxhYmVsXzI4OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQlJFQUs6Ci0gICAgICAgIGNhc2UgQ0FTRToKLSAgICAgICAgY2FzZSBDTEFTUzoKLSAgICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgIGNhc2UgRE86Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgRk9SOgotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJRjoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgY2FzZSBSRVRVUk46Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICBjYXNlIFNXSVRDSDoKLSAgICAgICAgY2FzZSBUSElTOgotICAgICAgICBjYXNlIFRIUk9XOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgVFJZOgotICAgICAgICBjYXNlIFRZUEVPRjoKLSAgICAgICAgY2FzZSBVU0U6Ci0gICAgICAgIGNhc2UgVkFSOgotICAgICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgIGNhc2UgV0hJTEU6Ci0gICAgICAgIGNhc2UgV0lUSDoKLSAgICAgICAgY2FzZSBFWFBPUlQ6Ci0gICAgICAgIGNhc2UgSU5URVJGQUNFOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJTVBPUlQ6Ci0gICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgICAgY2FzZSBCQU5HOgotICAgICAgICBjYXNlIFRJTERFOgotICAgICAgICBjYXNlIElOQ1I6Ci0gICAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNjldID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI4OwotICAgICAgICB9Ci0gICAgICAgIENhc2VFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENhc2VFbGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQ2FzZUVsZW1lbnQgKi8KLSAgQVNUQ2FzZUVsZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RDYXNlRWxlbWVudCh0aGlzLCBKSlRDQVNFRUxFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQlJFQUs6Ci0gICAgICBjYXNlIENMQVNTOgotICAgICAgY2FzZSBDT05TVDoKLSAgICAgIGNhc2UgQ09OVElOVUU6Ci0gICAgICBjYXNlIERFTEVURToKLSAgICAgIGNhc2UgRE86Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGT1I6Ci0gICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElGOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBOQU1FU1BBQ0U6Ci0gICAgICBjYXNlIE5FVzoKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBSRVRVUk46Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICBjYXNlIFNXSVRDSDoKLSAgICAgIGNhc2UgVEhJUzoKLSAgICAgIGNhc2UgVEhST1c6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIFRSWToKLSAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgY2FzZSBVU0U6Ci0gICAgICBjYXNlIFZBUjoKLSAgICAgIGNhc2UgVk9JRDoKLSAgICAgIGNhc2UgV0hJTEU6Ci0gICAgICBjYXNlIFdJVEg6Ci0gICAgICBjYXNlIEVYUE9SVDoKLSAgICAgIGNhc2UgSU5URVJGQUNFOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIElNUE9SVDoKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgY2FzZSBTRU1JQ09MT046Ci0gICAgICBjYXNlIEJBTkc6Ci0gICAgICBjYXNlIFRJTERFOgotICAgICAgY2FzZSBJTkNSOgotICAgICAgY2FzZSBERUNSOgotICAgICAgY2FzZSBQTFVTOgotICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgRGlyZWN0aXZlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDQVNFOgotICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgQ2FzZUxhYmVsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzcwXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBDYXNlTGFiZWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDYXNlTGFiZWwgKi8KLSAgQVNUQ2FzZUxhYmVsIGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUxhYmVsKHRoaXMsIEpKVENBU0VMQUJFTCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ0FTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDQVNFKTsKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihfREVGQVVMVCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs3MV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEby1XaGlsZSBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBEb1N0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIERvU3RhdGVtZW50ICovCi0gIEFTVERvU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNURG9TdGF0ZW1lbnQodGhpcywgSkpURE9TVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihETyk7Ci0gICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oV0hJTEUpOwotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBXaGlsZSBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFdoaWxlU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgV2hpbGVTdGF0ZW1lbnQgKi8KLSAgQVNUV2hpbGVTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RXaGlsZVN0YXRlbWVudCh0aGlzLCBKSlRXSElMRVNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFdISUxFKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBGb3IgU3RhdGVtZW50cyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZvclN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZvclN0YXRlbWVudCAqLwotICBBU1RGb3JTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RGb3JTdGF0ZW1lbnQodGhpcywgSkpURk9SU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzE2KDIxNDc0ODM2NDcpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRk9SKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBGb3JJbkJpbmRpbmcoKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTik7Ci0gICAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBGT1I6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihGT1IpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICAgIGNhc2UgREVMRVRFOgotICAgICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICAgICAgY2FzZSBWQVI6Ci0gICAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgICBjYXNlIFRJTERFOgotICAgICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgICBGb3JJbml0aWFsaXplcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVs3Ml0gPSBqal9nZW47Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICAgIGNhc2UgTkVXOgotICAgICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICAgIGNhc2UgVk9JRDoKLSAgICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICBjYXNlIEJBTkc6Ci0gICAgICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgICBjYXNlIElOQ1I6Ci0gICAgICAgICAgY2FzZSBERUNSOgotICAgICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbNzNdID0gampfZ2VuOwotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICAgIGNhc2UgR0VUOgotICAgICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICAgIGNhc2UgU0VUOgotICAgICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgICAgY2FzZSBUSElTOgotICAgICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgICBjYXNlIFRZUEVPRjoKLSAgICAgICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgY2FzZSBCQU5HOgotICAgICAgICAgIGNhc2UgVElMREU6Ci0gICAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzc0XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs3NV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgfQotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZvckluaXRpYWxpemVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRm9ySW5pdGlhbGl6ZXIgKi8KLSAgQVNURm9ySW5pdGlhbGl6ZXIgamp0bjAwMCA9IG5ldyBBU1RGb3JJbml0aWFsaXplcih0aGlzLCBKSlRGT1JJTklUSUFMSVpFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8xNygzKSkgewotICAgICAgICBMaXN0RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25Ob0lOKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNzZdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZvckluQmluZGluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZvckluQmluZGluZyAqLwotICBBU1RGb3JJbkJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RGb3JJbkJpbmRpbmcodGhpcywgSkpURk9SSU5CSU5ESU5HKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzE4KDMpKSB7Ci0gICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgY2FzZSBWQVI6Ci0gICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpOwotICAgICAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpOwotICAgICAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNzddID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gV2l0aCBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBXaXRoU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgV2l0aFN0YXRlbWVudCAqLwotICBBU1RXaXRoU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUV2l0aFN0YXRlbWVudCh0aGlzLCBKSlRXSVRIU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oV0lUSCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBFeHByZXNzaW9uU3RhdGVtZW50KCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb250aW51ZSBhbmQgQnJlYWsgU3RhdGVtZW50Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBDb250aW51ZVN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIENvbnRpbnVlU3RhdGVtZW50ICovCi0gIEFTVENvbnRpbnVlU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUQ29udGludWVTdGF0ZW1lbnQodGhpcywgSkpUQ09OVElOVUVTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihDT05USU5VRSk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNzhdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJyZWFrU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQnJlYWtTdGF0ZW1lbnQgKi8KLSAgQVNUQnJlYWtTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RCcmVha1N0YXRlbWVudCh0aGlzLCBKSlRCUkVBS1NUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEJSRUFLKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs3OV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSZXR1cm4gU3RhdGVtZW50Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBSZXR1cm5TdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBSZXR1cm5TdGF0ZW1lbnQgKi8KLSAgQVNUUmV0dXJuU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUUmV0dXJuU3RhdGVtZW50KHRoaXMsIEpKVFJFVFVSTlNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJFVFVSTik7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgREVMRVRFOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICBjYXNlIFRISVM6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIFRZUEVPRjoKLSAgICAgIGNhc2UgVk9JRDoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICBjYXNlIEJBTkc6Ci0gICAgICBjYXNlIFRJTERFOgotICAgICAgY2FzZSBJTkNSOgotICAgICAgY2FzZSBERUNSOgotICAgICAgY2FzZSBQTFVTOgotICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbODBdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVGhyb3cgU3RhdGVtZW50Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBUaHJvd1N0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFRocm93U3RhdGVtZW50ICovCi0gIEFTVFRocm93U3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUVGhyb3dTdGF0ZW1lbnQodGhpcywgSkpUVEhST1dTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihUSFJPVyk7Ci0gICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRyeSBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFRyeVN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFRyeVN0YXRlbWVudCAqLwotICBBU1RUcnlTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RUcnlTdGF0ZW1lbnQodGhpcywgSkpUVFJZU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJZKTsKLSAgICAgIEJsb2NrKCk7Ci0gICAgICBsYWJlbF8yOToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENBVENIOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbODFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI5OwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0FUQ0gpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBCbG9jaygpOwotICAgICAgfQotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEZJTkFMTFk6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRklOQUxMWSk7Ci0gICAgICAgIEJsb2NrKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzgyXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERpcmVjdGl2ZXMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBEaXJlY3RpdmVzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlcyAqLwotICBBU1REaXJlY3RpdmVzIGpqdG4wMDAgPSBuZXcgQVNURGlyZWN0aXZlcyh0aGlzLCBKSlRESVJFQ1RJVkVTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGxhYmVsXzMwOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgRGlyZWN0aXZlKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJSRUFLOgotICAgICAgICBjYXNlIENMQVNTOgotICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgY2FzZSBETzoKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBGT1I6Ci0gICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElGOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgTkFNRVNQQUNFOgotICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFJFVFVSTjoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgIGNhc2UgU1dJVENIOgotICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGNhc2UgVEhST1c6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBUUlk6Ci0gICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICBjYXNlIFVTRToKLSAgICAgICAgY2FzZSBWQVI6Ci0gICAgICAgIGNhc2UgVk9JRDoKLSAgICAgICAgY2FzZSBXSElMRToKLSAgICAgICAgY2FzZSBXSVRIOgotICAgICAgICBjYXNlIEVYUE9SVDoKLSAgICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElNUE9SVDoKLSAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIGNhc2UgU0VNSUNPTE9OOgotICAgICAgICBjYXNlIEJBTkc6Ci0gICAgICAgIGNhc2UgVElMREU6Ci0gICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgY2FzZSBERUNSOgotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs4M10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRGlyZWN0aXZlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlICovCi0gIEFTVERpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVERpcmVjdGl2ZSh0aGlzLCBKSlRESVJFQ1RJVkUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbODRdID0gampfZ2VuOwotICAgICAgICBpZiAoampfMl8xOSgzKSkgewotICAgICAgICAgIFN0YXRlbWVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKGpqXzJfMjAoMikpIHsKLSAgICAgICAgICBBbm5vdGF0YWJsZURpcmVjdGl2ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGpqXzJfMjEoMikpIHsKLSAgICAgICAgICBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgICAgIERpcmVjdGl2ZXMoKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoampfMl8yMigyKSkgewotICAgICAgICAgIEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICBBbm5vdGF0YWJsZURpcmVjdGl2ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgICAgIEluY2x1ZGVEaXJlY3RpdmUoKTsKLSAgICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFVTRToKLSAgICAgICAgICAgIFByYWdtYSgpOwotICAgICAgICAgICAgU2MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbODVdID0gampfZ2VuOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBbm5vdGF0YWJsZURpcmVjdGl2ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFubm90YXRhYmxlRGlyZWN0aXZlICovCi0gIEFTVEFubm90YXRhYmxlRGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUodGhpcywgSkpUQU5OT1RBVEFCTEVESVJFQ1RJVkUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBWQVI6Ci0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbigpOwotICAgICAgICBTYygpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgIEZ1bmN0aW9uRGVmaW5pdGlvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICAgIENsYXNzRGVmaW5pdGlvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5URVJGQUNFOgotICAgICAgICBJbnRlcmZhY2VEZWZpbml0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOQU1FU1BBQ0U6Ci0gICAgICAgIE5hbWVzcGFjZURlZmluaXRpb24oKTsKLSAgICAgICAgU2MoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElNUE9SVDoKLSAgICAgICAgSW1wb3J0RGlyZWN0aXZlKCk7Ci0gICAgICAgIFNjKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFWFBPUlQ6Ci0gICAgICAgIEV4cG9ydERlZmluaXRpb24oKTsKLSAgICAgICAgU2MoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVTRToKLSAgICAgICAgVXNlRGlyZWN0aXZlKCk7Ci0gICAgICAgIFNjKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzg2XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICB9Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBdHRyaWJ1dGVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBBdHRyaWJ1dGVzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQXR0cmlidXRlcyAqLwotICBBU1RBdHRyaWJ1dGVzIGpqdG4wMDAgPSBuZXcgQVNUQXR0cmlidXRlcyh0aGlzLCBKSlRBVFRSSUJVVEVTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGxhYmVsXzMxOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgQXR0cmlidXRlKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbODddID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzMxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEF0dHJpYnV0ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZSAqLwotICBBU1RBdHRyaWJ1dGUgamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGUodGhpcywgSkpUQVRUUklCVVRFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIEF0dHJpYnV0ZUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJVRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzg4XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBVc2UgRGlyZWN0aXZlCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBVc2VEaXJlY3RpdmUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBVc2VEaXJlY3RpdmUgKi8KLSAgQVNUVXNlRGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUVXNlRGlyZWN0aXZlKHRoaXMsIEpKVFVTRURJUkVDVElWRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFVTRSk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKE5BTUVTUEFDRSk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEltcG9ydCBEaXJlY3RpdmUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEltcG9ydERpcmVjdGl2ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEltcG9ydERpcmVjdGl2ZSAqLwotICBBU1RJbXBvcnREaXJlY3RpdmUgamp0bjAwMCA9IG5ldyBBU1RJbXBvcnREaXJlY3RpdmUodGhpcywgSkpUSU1QT1JURElSRUNUSVZFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzIzKDMpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU1QT1JUKTsKLSAgICAgICAgUGFja2FnZU5hbWUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElNUE9SVDoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElNUE9SVCk7Ci0gICAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgICAgICBQYWNrYWdlTmFtZSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs4OV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJbmNsdWRlIERpcmVjdGl2ZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgSW5jbHVkZURpcmVjdGl2ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEluY2x1ZGVEaXJlY3RpdmUgKi8KLSAgQVNUSW5jbHVkZURpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEluY2x1ZGVEaXJlY3RpdmUodGhpcywgSkpUSU5DTFVERURJUkVDVElWRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKElOQ0xVREUpOwotICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByYWdtYQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgUHJhZ21hKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hICovCi0gIEFTVFByYWdtYSBqanRuMDAwID0gbmV3IEFTVFByYWdtYSh0aGlzLCBKSlRQUkFHTUEpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihVU0UpOwotICAgICAgUHJhZ21hSXRlbXMoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUHJhZ21hSXRlbXMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcmFnbWFJdGVtcyAqLwotICBBU1RQcmFnbWFJdGVtcyBqanRuMDAwID0gbmV3IEFTVFByYWdtYUl0ZW1zKHRoaXMsIEpKVFBSQUdNQUlURU1TKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFByYWdtYUl0ZW0oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgUHJhZ21hSXRlbSgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQcmFnbWFJdGVtKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hSXRlbSAqLwotICBBU1RQcmFnbWFJdGVtIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hSXRlbSh0aGlzLCBKSlRQUkFHTUFJVEVNKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFByYWdtYUV4cHIoKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs5MF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUHJhZ21hRXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByYWdtYUV4cHIgKi8KLSAgQVNUUHJhZ21hRXhwciBqanRuMDAwID0gbmV3IEFTVFByYWdtYUV4cHIodGhpcywgSkpUUFJBR01BRVhQUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIFByYWdtYUFyZ3VtZW50KCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbOTFdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFByYWdtYUFyZ3VtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hQXJndW1lbnQgKi8KLSAgQVNUUHJhZ21hQXJndW1lbnQgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFBcmd1bWVudCh0aGlzLCBKSlRQUkFHTUFBUkdVTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZBTFNFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUNJTUFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihPQ1RBTF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhFWF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzkyXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEZWZpbml0aW9ucyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBFeHBvcnQgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEV4cG9ydERlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFeHBvcnREZWZpbml0aW9uICovCi0gIEFTVEV4cG9ydERlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RFeHBvcnREZWZpbml0aW9uKHRoaXMsIEpKVEVYUE9SVERFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihFWFBPUlQpOwotICAgICAgRXhwb3J0QmluZGluZ0xpc3QoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXhwb3J0QmluZGluZ0xpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nTGlzdCAqLwotICBBU1RFeHBvcnRCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVEV4cG9ydEJpbmRpbmdMaXN0KHRoaXMsIEpKVEVYUE9SVEJJTkRJTkdMSVNUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEV4cG9ydEJpbmRpbmcoKTsKLSAgICAgIGxhYmVsXzMyOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5M10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzI7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIEV4cG9ydEJpbmRpbmcoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXhwb3J0QmluZGluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEV4cG9ydEJpbmRpbmcgKi8KLSAgQVNURXhwb3J0QmluZGluZyBqanRuMDAwID0gbmV3IEFTVEV4cG9ydEJpbmRpbmcodGhpcywgSkpURVhQT1JUQklORElORyk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yNCgyKSkgewotICAgICAgICBGdW5jdGlvbk5hbWUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIEZ1bmN0aW9uTmFtZSgpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgICAgICBGdW5jdGlvbk5hbWUoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOTRdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmFyaWFibGUgRGVmaW5pdGlvbiAoaW4sIE5vSU4pCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZURlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb24gKi8KLSAgQVNUVmFyaWFibGVEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uKHRoaXMsIEpKVFZBUklBQkxFREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCk7Ci0gICAgICBWYXJpYWJsZUJpbmRpbmdMaXN0KCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25Ob0lOICovCi0gIEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOKHRoaXMsIEpKVFZBUklBQkxFREVGSU5JVElPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpOwotICAgICAgVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgKi8KLSAgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZCBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQodGhpcywgSkpUVkFSSUFCTEVERUZJTklUSU9OS0lORCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgVkFSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFZBUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT05TVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzk1XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVCaW5kaW5nTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ0xpc3QgKi8KLSAgQVNUVmFyaWFibGVCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3QodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTElTVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBWYXJpYWJsZUJpbmRpbmcoKTsKLSAgICAgIGxhYmVsXzMzOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5Nl0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzM7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIFZhcmlhYmxlQmluZGluZygpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICB9Ci0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgIH0KLSAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICB9Ci0gICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAqLwotICBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKHRoaXMsIEpKVFZBUklBQkxFQklORElOR0xJU1ROT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgIGxhYmVsXzM0OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5N10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzQ7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICBpZiAoamp0YzAwMCkgewotICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgfQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICB9Ci0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgfQotICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICBpZiAoamp0YzAwMCkgewotICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhcmlhYmxlQmluZGluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZyAqLwotICBBU1RWYXJpYWJsZUJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUJpbmRpbmcodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFR5cGVkSWRlbnRpZmllcigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEFTU0lHTjoKLSAgICAgICAgVmFyaWFibGVJbml0aWFsaXNhdGlvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs5OF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVCaW5kaW5nTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ05vSU4gKi8KLSAgQVNUVmFyaWFibGVCaW5kaW5nTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ05vSU4odGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBUeXBlZElkZW50aWZpZXJOb0lOKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQVNTSUdOOgotICAgICAgICBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs5OV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVJbml0aWFsaXNhdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGlzYXRpb24gKi8KLSAgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24odGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEFTU0lHTik7Ci0gICAgICBWYXJpYWJsZUluaXRpYWxpemVyKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiAqLwotICBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElTQVRJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVJbml0aWFsaXplcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKi8KLSAgQVNUVmFyaWFibGVJbml0aWFsaXplciBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIodGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVpFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yNSgzKSkgewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMDBdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKi8KLSAgQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTih0aGlzLCBKSlRWQVJJQUJMRUlOSVRJQUxJWkVSTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yNigzKSkgewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTAxXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBUeXBlZElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXIgKi8KLSAgQVNUVHlwZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUVHlwZWRJZGVudGlmaWVyKHRoaXMsIEpKVFRZUEVESURFTlRJRklFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ09MT046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBUeXBlRXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMDJdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFR5cGVkSWRlbnRpZmllck5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXJOb0lOICovCi0gIEFTVFR5cGVkSWRlbnRpZmllck5vSU4gamp0bjAwMCA9IG5ldyBBU1RUeXBlZElkZW50aWZpZXJOb0lOKHRoaXMsIEpKVFRZUEVESURFTlRJRklFUk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgSWRlbnRpZmllcigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTE9OOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgVHlwZUV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzEwM10gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTaW1wbGUgVmFyaWFibGUgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAqLwotICBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24odGhpcywgSkpUU0lNUExFVkFSSUFCTEVERUZJTklUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVkFSKTsKLSAgICAgIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QgKi8KLSAgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3Qgamp0bjAwMCA9IG5ldyBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCh0aGlzLCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HTElTVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCk7Ci0gICAgICBsYWJlbF8zNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTA0XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zNTsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgVW50eXBlZFZhcmlhYmxlQmluZGluZygpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZyAqLwotICBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nIGpqdG4wMDAgPSBuZXcgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyh0aGlzLCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIFZhcmlhYmxlSW5pdGlhbGlzYXRpb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBGdW5jdGlvbiBEZWZpbml0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBGdW5jdGlvbkRlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkRlZmluaXRpb24gKi8KLSAgQVNURnVuY3Rpb25EZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25EZWZpbml0aW9uKHRoaXMsIEpKVEZVTkNUSU9OREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEZVTkNUSU9OKTsKLSAgICAgIEZ1bmN0aW9uTmFtZSgpOwotICAgICAgRnVuY3Rpb25Db21tb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVuY3Rpb25OYW1lKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25OYW1lICovCi0gIEFTVEZ1bmN0aW9uTmFtZSBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uTmFtZSh0aGlzLCBKSlRGVU5DVElPTk5BTUUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMjcoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihHRVQpOwotICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICB9IGVsc2UgaWYgKGpqXzJfMjgoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTRVQpOwotICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEwNV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVuY3Rpb25Db21tb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbW1vbiAqLwotICBBU1RGdW5jdGlvbkNvbW1vbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uQ29tbW9uKHRoaXMsIEpKVEZVTkNUSU9OQ09NTU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDT05TVDoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIEVMSVBTRToKLSAgICAgICAgUGFyYW1ldGVycygpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMDZdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ09MT046Ci0gICAgICAgIFJlc3VsdCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMDddID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBCbG9jaygpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQYXJhbWV0ZXJzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFyYW1ldGVycyAqLwotICBBU1RQYXJhbWV0ZXJzIGpqdG4wMDAgPSBuZXcgQVNUUGFyYW1ldGVycyh0aGlzLCBKSlRQQVJBTUVURVJTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBFTElQU0U6Ci0gICAgICAgIFJlc3RQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDT05TVDoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFBhcmFtZXRlckluaXQoKTsKLSAgICAgICAgbGFiZWxfMzY6Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMTA4XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIGJyZWFrIGxhYmVsXzM2OwotICAgICAgICAgIH0KLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgICBQYXJhbWV0ZXJJbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRUxJUFNFOgotICAgICAgICAgIFJlc3RQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEwOV0gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzExMF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUGFyYW1ldGVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFyYW1ldGVyICovCi0gIEFTVFBhcmFtZXRlciBqanRuMDAwID0gbmV3IEFTVFBhcmFtZXRlcih0aGlzLCBKSlRQQVJBTUVURVIpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTlNUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTExXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgVHlwZWRJZGVudGlmaWVyKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhcmFtZXRlckluaXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJJbml0ICovCi0gIEFTVFBhcmFtZXRlckluaXQgamp0bjAwMCA9IG5ldyBBU1RQYXJhbWV0ZXJJbml0KHRoaXMsIEpKVFBBUkFNRVRFUklOSVQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgUGFyYW1ldGVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFTU0lHTik7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzExMl0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUmVzdFBhcmFtZXRlcnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBSZXN0UGFyYW1ldGVycyAqLwotICBBU1RSZXN0UGFyYW1ldGVycyBqanRuMDAwID0gbmV3IEFTVFJlc3RQYXJhbWV0ZXJzKHRoaXMsIEpKVFJFU1RQQVJBTUVURVJTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxJUFNFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT05TVCk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTEzXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBSZXN1bHQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBSZXN1bHQgKi8KLSAgQVNUUmVzdWx0IGpqdG4wMDAgPSBuZXcgQVNUUmVzdWx0KHRoaXMsIEpKVFJFU1VMVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgIFR5cGVFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ2xhc3MgRGVmaW5pdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQ2xhc3NEZWZpbml0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQ2xhc3NEZWZpbml0aW9uICovCi0gIEFTVENsYXNzRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVENsYXNzRGVmaW5pdGlvbih0aGlzLCBKSlRDTEFTU0RFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihDTEFTUyk7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRVhURU5EUzoKLSAgICAgIGNhc2UgSU1QTEVNRU5UUzoKLSAgICAgICAgSW5oZXJpdGFuY2UoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTE0XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgQmxvY2soKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgSW50ZXJmYWNlRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEludGVyZmFjZURlZmluaXRpb24gKi8KLSAgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVEludGVyZmFjZURlZmluaXRpb24odGhpcywgSkpUSU5URVJGQUNFREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yOSgzKSkgewotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOVEVSRkFDRSk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgU2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElOVEVSRkFDRToKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOVEVSRkFDRSk7Ci0gICAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgRVhURU5EUzoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EUyk7Ci0gICAgICAgICAgICBUeXBlRXhwcmVzc2lvbkxpc3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMTE1XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQmxvY2soKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTE2XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBJbmhlcml0YW5jZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEluaGVyaXRhbmNlICovCi0gIEFTVEluaGVyaXRhbmNlIGpqdG4wMDAgPSBuZXcgQVNUSW5oZXJpdGFuY2UodGhpcywgSkpUSU5IRVJJVEFOQ0UpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEVYVEVORFM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EUyk7Ci0gICAgICAgIFR5cGVFeHByZXNzaW9uKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElNUExFTUVOVFM6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihJTVBMRU1FTlRTKTsKLSAgICAgICAgICBUeXBlRXhwcmVzc2lvbkxpc3QoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTE3XSA9IGpqX2dlbjsKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElNUExFTUVOVFM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU1QTEVNRU5UUyk7Ci0gICAgICAgIFR5cGVFeHByZXNzaW9uTGlzdCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMThdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTmFtZXNwYWNlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBOYW1lc3BhY2VEZWZpbml0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTmFtZXNwYWNlRGVmaW5pdGlvbiAqLwotICBBU1ROYW1lc3BhY2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUTmFtZXNwYWNlRGVmaW5pdGlvbih0aGlzLCBKSlROQU1FU1BBQ0VERUZJTklUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkFNRVNQQUNFKTsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQYWNrYWdlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBQYWNrYWdlRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFBhY2thZ2VEZWZpbml0aW9uICovCi0gIEFTVFBhY2thZ2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUUGFja2FnZURlZmluaXRpb24odGhpcywgSkpUUEFDS0FHRURFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihQQUNLQUdFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzExOV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIEJsb2NrKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhY2thZ2VOYW1lKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZU5hbWUgKi8KLSAgQVNUUGFja2FnZU5hbWUgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlTmFtZSh0aGlzLCBKSlRQQUNLQUdFTkFNRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RSSU5HX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFBhY2thZ2VJZGVudGlmaWVycygpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMjBdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhY2thZ2VJZGVudGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFBhY2thZ2VJZGVudGlmaWVycyAqLwotICBBU1RQYWNrYWdlSWRlbnRpZmllcnMgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlSWRlbnRpZmllcnModGhpcywgSkpUUEFDS0FHRUlERU5USUZJRVJTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIGxhYmVsXzM3OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRE9UOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTIxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zNzsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzMoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18zKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMiwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzQoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgzLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfNSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDQsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzYoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM182KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoNSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNyhpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzcoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSg2LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl84KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfOCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDcsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzkoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM185KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoOCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTAoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xMCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDksIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzExKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxMCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTIoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDExLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xMyhpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEzKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTIsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE0KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTQoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxMywgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTUoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xNSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDE0LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xNihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzE2KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTUsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE3KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTcoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxNiwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTgoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xOCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDE3LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xOShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzE5KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTgsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIwKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjAoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxOSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjEoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yMSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDIwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yMihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzIyKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIzKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjMoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyMiwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjQoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yNCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDIzLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yNShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzI1KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjQsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI2KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjYoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyNSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjcoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yNygpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDI2LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yOChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzI4KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjcsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI5KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjkoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyOCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NCgpIHsKLSAgICBpZiAoampfM1JfMTgyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xOTgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM5KCkgewotICAgIGlmIChqal8zUl8yNDIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIyMigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM3KCkgewotICAgIGlmIChqal8zUl8xNjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE2OSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODIoKSB7Ci0gICAgaWYgKGpqXzNSXzIwMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjE4KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMCgpIHsKLSAgICBpZiAoampfM1JfMjQyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2OCgpIHsKLSAgICBpZiAoampfM1JfMTk5KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yMDAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM1KCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTY2KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1NCgpIHsKLSAgICBpZiAoampfM1JfMjU3KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihCSVRfT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElNUExFTUVOVFMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NCgpIHsKLSAgICBpZiAoampfM1JfMTM1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig3MCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl85NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMSgpIHsKLSAgICBpZiAoampfM1JfMjIyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yMzkoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQxKCkgewotICAgIGlmIChqal8zUl8yNTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI0MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTkoKSB7Ci0gICAgaWYgKGpqXzNSXzIxOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjIwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MygpIHsKLSAgICBpZiAoampfM1JfMjY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNTgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0MigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihYT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5BTUVTUEFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAwKCkgewotICAgIGlmIChqal8zUl8zMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMigpIHsKLSAgICBpZiAoampfM1JfMjQzKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yNTQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTYyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElOVEVSRkFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzA2KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU2KCkgewotICAgIGlmIChqal8zUl8yNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI1NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElNUExFTUVOVFMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhURU5EUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yODYoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMyMigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDUoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMxMygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzE0KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE5KCkgewotICAgIGlmIChqal8zUl8yNDAoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI0MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTAoKSB7Ci0gICAgaWYgKGpqXzNSXzI4NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEJJVF9BTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI5KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzI5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNjIoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElOVEVSRkFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0xBU1MpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMwMCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0MygpIHsKLSAgICBpZiAoampfM1JfMjU4KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yNjMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTlNUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzcoKSB7Ci0gICAgaWYgKGpqXzNSXzI4MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQwKCkgewotICAgIGlmIChqal8zUl8yNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI1NigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjg2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MigpIHsKLSAgICBpZiAoampfM1JfNjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFTElQU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjkyKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yODUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5OSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzNCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzUoKSB7Ci0gICAgaWYgKGpqXzNSXzYwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI3NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyOSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NSgpIHsKLSAgICBpZiAoampfM1JfMjg3KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTMoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU4KCkgewotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjcxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMykpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIxNigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNDIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyOSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjkoKSB7Ci0gICAgaWYgKGpqXzNSXzI3MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjIoKSB7Ci0gICAgaWYgKGpqXzNSXzEwMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk1KCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgxKCkgewotICAgIGlmIChqal8zUl8yODUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI4OSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5MCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTUoKSB7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zXzExKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4MCgpIHsKLSAgICBpZiAoampfM1JfMjg0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzMoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI4MCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjgxKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI2OSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI3NygpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwMCgpIHsKLSAgICBpZiAoampfM1JfMTQzKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl85OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oOTQpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5MykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDMwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oOCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEdFVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzk1KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzKCkgewotICAgIGlmIChqal8zUl82MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNjIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEZVTkNUSU9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExNikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExNykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExOCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MigpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzMyMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQyKCkgewotICAgIGlmIChqal8zUl8xODEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjEoKSB7Ci0gICAgaWYgKGpqXzNSXzk5KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xMDAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM2KCkgewotICAgIGlmIChqal8zUl8yNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzMyNCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjg2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDMoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTA4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTA5KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVkFSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIzNigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEVMSVBTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUyKCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTg3KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNigpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk5KCkgewotICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE0MigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxJUFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTYoKSB7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTUoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI5KCkgewotICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExNSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjYoKSB7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDYoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIyNigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1MygpIHsKLSAgICBpZiAoampfM1JfMTg4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE3MSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTcyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3NCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTc1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTc4KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE4MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcxKCkgewotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEJBTkcpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVElMREUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTUlOVVMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjcoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMyOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihQTFVTKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yNSgpIHsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihERUNSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUoKSB7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI2NSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5DUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTc0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFRZUEVPRikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3MygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihWT0lEKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKERFTEVURSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzEyKCkgewotICAgIGlmIChqal8zUl8zMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBU1NJR04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjA2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjI0KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzMwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzExOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0lHTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMjcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxJUFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM185KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzEwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExOSgpIHsKLSAgICBpZiAoampfM1JfMTUyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNTMoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE5NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM184KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxJUFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NigpIHsKLSAgICBpZiAoampfM1JfMjE2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zMTIoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzU3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfOCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTgoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl85OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk0KCkgewotICAgIGlmIChqal8zUl80MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI4KCkgewotICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzMzMCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE5MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTk0KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkzKCkgewotICAgIGlmIChqal8zUl80MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180KCkgewotICAgIGlmIChqal8zUl80MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI0KCkgewotICAgIGlmIChqal8zUl8xNTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyMSgpIHsKLSAgICBpZiAoampfM1JfMTU2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjEoKSB7Ci0gICAgaWYgKGpqXzNSXzE5NigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzA0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMDYpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMDcpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExOCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0NykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFFVQUxJRklFUikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzUoKSB7Ci0gICAgaWYgKGpqXzNSXzI1MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM0KCkgewotICAgIGlmIChqal8zUl8xOTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MygpIHsKLSAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMygpIHsKLSAgICBpZiAoampfM1JfMTI1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTUoKSB7Ci0gICAgaWYgKGpqXzNSXzE2MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMyKCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxNygpIHsKLSAgICBpZiAoampfM1JfNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzEoKSB7Ci0gICAgaWYgKGpqXzNSXzE5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE5NygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE0KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yMzAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIzMSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjMyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMzMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIzNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjM1KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMCgpIHsKLSAgICBpZiAoampfM1JfMTcwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjYoKSB7Ci0gICAgaWYgKGpqXzNSXzExOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTYxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRlVOQ1RJT05fKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjMoKSB7Ci0gICAgaWYgKGpqXzNSXzE2MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yNCgpIHsKLSAgICBpZiAoampfM1JfNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18yNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjE3KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihRVUFMSUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5FVykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNfNCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfNSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjQoKSB7Ci0gICAgaWYgKGpqXzNSXzE5NygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzA3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1OSgpIHsKLSAgICBpZiAoampfM1JfMTkyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTgoKSB7Ci0gICAgaWYgKGpqXzNSXzE5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNTcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE1OCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTU5KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NygpIHsKLSAgICBpZiAoampfM1JfMTcwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhQT1JUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE2NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIwKCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE1NSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUVVBTElGSUVSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84NCgpIHsKLSAgICBpZiAoampfM1JfMTI1KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgzKCkgewotICAgIGlmIChqal8zUl8xMjIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzEyMygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEyNCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84MigpIHsKLSAgICBpZiAoampfM1JfMTIwKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xMjEoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzgyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfODQoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE2KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQzKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjApKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2NSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDY3KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjYpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2OCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDcwKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNjYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTVVBFUikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzIoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgyKCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzA4KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NigpIHsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0OCgpIHsKLSAgICBpZiAoampfM1JfMjYxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzQoKSB7Ci0gICAgaWYgKGpqXzNSXzI4MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5NykpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MSgpIHsKLSAgICBpZiAoampfM1JfMjY2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yNjcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcwKCkgewotICAgIGlmIChqal8zUl8yNzQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjc0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjQ4KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFVTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNzAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2MygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJTVBPUlQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjY4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yODgoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjc4KCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJTkNMVURFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RSSU5HX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDcwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjUpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjc4KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yNzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2OCgpIHsKLSAgICBpZiAoampfM1JfMjcyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDkoKSB7Ci0gICAgaWYgKGpqXzNSXzI2MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzIzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElNUE9SVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYyKCkgewotICAgIGlmIChqal8zUl8yNjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI3NigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRlVOQ1RJT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE2NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0MykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDIwKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY1KCkgewotICAgIGlmIChqal8zUl8xMjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihVU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOQU1FU1BBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjQ5KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGVU5DVElPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI5KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzI1MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkzKCkgewotICAgIGlmIChqal8zUl8xMzQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICBpZiAoampfM1JfOTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfOTMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA4KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNTkpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkyKCkgewotICAgIGlmIChqal8zUl8xMzMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQ2KCkgewotICAgIGlmIChqal8zUl8yNjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTEoKSB7Ci0gICAgaWYgKGpqXzNSXzEzMigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDUoKSB7Ci0gICAgaWYgKGpqXzNSXzI1OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85MCgpIHsKLSAgICBpZiAoampfM1JfMTMxKCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzg5KCkgewotICAgIGlmIChqal8zUl8xMzAoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODgoKSB7Ci0gICAgaWYgKGpqXzNSXzEyOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODcoKSB7Ci0gICAgaWYgKGpqXzNSXzEyOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODYoKSB7Ci0gICAgaWYgKGpqXzNSXzEyNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIzKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yNDQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMTkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzI0NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjQ2KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDQoKSB7Ci0gICAgaWYgKGpqXzNSXzIwMygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODUoKSB7Ci0gICAgaWYgKGpqXzNSXzEyNigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfODUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzg2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfODgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzg5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl85MCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfOTEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzkyKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEzKCkgewotICAgIGlmIChqal8zUl8yMjkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxMigpIHsKLSAgICBpZiAoampfM1JfMjI4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTEoKSB7Ci0gICAgaWYgKGpqXzNSXzIyNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yMigpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIxKCkgewotICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTgzKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIwKCkgewotICAgIGlmIChqal8zUl81MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xOSgpIHsKLSAgICBpZiAoampfM1JfNDcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihRVUFMSUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMigpIHsKLSAgICBpZiAoampfM1JfMjIzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzMpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0MykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDIwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjUpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2NykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDY2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig3MCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQxKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNzcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjEwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMTEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIxMigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjEzKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgzKCkgewotICAgIFRva2VuIHhzcDsKLSAgICBpZiAoampfM1JfMjAyKCkpIHJldHVybiB0cnVlOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzIwMigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDAoKSB7Ci0gICAgaWYgKGpqXzNSXzE3MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFFVQUxJRklFUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTgoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEzOSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTQwKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM5KCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGSU5BTExZKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENBVENIKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihUUlkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTA1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yOTgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTkoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihRVUFMSUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5MCgpIHsKLSAgICBpZiAoampfM1JfMjA4KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yMDkoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUxKCkgewotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU0KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xODkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE5MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4OSgpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzIwNygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVEhST1cpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSRVRVUk4pKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTUxKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1MCgpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU1KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDc4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjUpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDI4KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0OSgpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihCUkVBSykpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNTAoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTEzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTlRJTlVFKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE0OSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84MCgpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzExOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl83OSgpIHsKLSAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihXSVRIKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ2KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NSgpIHsKLSAgICBpZiAoampfM1JfMjE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzgoKSB7Ci0gICAgaWYgKGpqXzNSXzUyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzNygpIHsKLSAgICBpZiAoampfM1JfMjUzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDMoKSB7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDIoKSB7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE4KCkgewotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDgoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMTgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzc5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRk9SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE5NSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMwMigpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMwMygpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTcoKSB7Ci0gICAgaWYgKGpqXzNSXzQ5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTUoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMTcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIzNygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjM4KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRk9SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKElOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTQ3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNDgoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRk9SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKElOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihXSElMRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRE8pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFdISUxFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oX0RFRkFVTFQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0FTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTEoKSB7Ci0gICAgaWYgKGpqXzNSXzMyMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzEwKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zMTgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMxOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5NygpIHsKLSAgICBpZiAoampfM1JfMzAxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjYoKSB7Ci0gICAgaWYgKGpqXzNSXzMxMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI1KCkgewotICAgIGlmIChqal8zUl8yMjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyMCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzI1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zMjYoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDEoKSB7Ci0gICAgaWYgKGpqXzNSXzMxMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzExKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTV0lUQ0gpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5NygpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJRikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTYoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ1KCkgewotICAgIGlmIChqal8zUl8xODMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwNigpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE0NSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU1VQRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ2KCkgewotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODYoKSB7Ci0gICAgaWYgKGpqXzNSXzUyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMDkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4NSgpIHsKLSAgICBpZiAoampfM1JfMjA0KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTg0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzE1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xODUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE4NigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg0KCkgewotICAgIGlmIChqal8zUl8yMDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxNygpIHsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDkoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIGlmIChqal8zUl8zMTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzE3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc4KCkgewotICAgIGlmIChqal8zUl8xMTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc3KCkgewotICAgIGlmIChqal8zUl8xMTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzYoKSB7Ci0gICAgaWYgKGpqXzNSXzExNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl83NSgpIHsKLSAgICBpZiAoampfM1JfMTE0KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc0KCkgewotICAgIGlmIChqal8zUl8xMTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzMoKSB7Ci0gICAgaWYgKGpqXzNSXzExMigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xNSgpIHsKLSAgICBpZiAoampfM1JfNDcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzcyKCkgewotICAgIGlmIChqal8zUl8xMTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzcxKCkgewotICAgIGlmIChqal8zUl8xMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yOTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzcwKCkgewotICAgIGlmIChqal8zUl8xMDkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjkoKSB7Ci0gICAgaWYgKGpqXzNSXzEwOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjgoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjcoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjYoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjUoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE0KCkgewotICAgIGlmIChqal8zUl80NigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18xNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNjUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzY2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl82NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNjgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzY5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83MCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzcyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzc1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83NigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzc4KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTUoKSB7Ci0gICAgaWYgKGpqXzNSXzI5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzIzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA1KCkgewotICAgIGlmIChqal8zUl8yMjUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTMoKSB7Ci0gICAgaWYgKGpqXzNSXzQ0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg2KCkgewotICAgIGlmIChqal8zUl8yOTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTIoKSB7Ci0gICAgaWYgKGpqXzNSXzQ0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDkoKSB7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl84MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82NCgpIHsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzEwMygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NSgpIHsKLSAgICBpZiAoampfM1JfNjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMTMoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzkoKSB7Ci0gICAgaWYgKGpqXzNSXzU2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzEyKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIyNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMjUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5NCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yOTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5MikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExOSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyOCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyOSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEhPT0spKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNSgpIHsKLSAgICBpZiAoampfM1JfMTAyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yNDcoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNDX09SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkxKCkgewotICAgIGlmIChqal8zUl85NigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjk0KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTQ19PUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMzcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYzKCkgewotICAgIGlmIChqal8zUl8xMDIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEzNigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0NfQU5EKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE4MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTYoKSB7Ci0gICAgaWYgKGpqXzNSXzk2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl85NygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0NfQU5EKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE2OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE4KCkgewotICAgIGlmIChqal8zUl8yMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIwMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAyKCkgewotICAgIGlmIChqal8zUl8xNDQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE2NygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NigpIHsKLSAgICBpZiAoampfM1JfMTM3KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xMzgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAwKCkgewotICAgIGlmIChqal8zUl8yMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE5OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSlNQYXJzZXIyMFRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7Ci0gIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOwotICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OwotICBwcml2YXRlIGludCBqal9udGs7Ci0gIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKLSAgcHJpdmF0ZSBpbnQgampfbGE7Ci0gIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBaGVhZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gampfc2VtTEE7Ci0gIHByaXZhdGUgaW50IGpqX2dlbjsKLSAgZmluYWwgcHJpdmF0ZSBpbnRbXSBqal9sYTEgPSBuZXcgaW50WzEyMl07Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8wOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMTsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzI7Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8zOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfNDsKLSAgc3RhdGljIHsKLSAgICAgIGpqX2xhMV8wKCk7Ci0gICAgICBqal9sYTFfMSgpOwotICAgICAgampfbGExXzIoKTsKLSAgICAgIGpqX2xhMV8zKCk7Ci0gICAgICBqal9sYTFfNCgpOwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMCgpIHsKLSAgICAgIGpqX2xhMV8wID0gbmV3IGludFtdIHsweDAsMHg5NmQzNzIwMCwweDEyMDAwMDAwLDB4MCwweDAsMHgxMjAwMDAwMCwweDEyMDAwMDAwLDB4OTAwMDAwLDB4MCwweDgwMDAwMCwweDEyMDAwMDAwLDB4MCwweDAsMHgxMjAwMDAwMCwweDEyOTEwMDAwLDB4MCwweDAsMHgwLDB4MCwweDEyOTAwMDAwLDB4MCwweDkwMDAwMCwweDEzOTAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDEyOTEwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NDAwMDAxMDAsMHg2ODAwMDEwMCwweDYwMDAwMTAwLDB4NjAwMDAxMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxNjQyNDIwMCwweDAsMHgxMjEwMDAwMCwweDE2ZDM0MjAwLDB4OTZkMzcyMDAsMHg0MDAwMCwweDg0MDAsMHg5NmQzZjYwMCwweDk2ZDNmNjAwLDB4ODQwMCwweDEyOTEyMDAwLDB4MTI5MTAwMDAsMHgxMjkxMDAwMCwweDQwMDAwMCwweDEyMTAyMDAwLDB4MTIxMDIwMDAsMHgxMjAwMDAwMCwweDEyMDAwMDAwLDB4MTI5MTAwMDAsMHg4MDAsMHgyMDAwMDAsMHg5NmQzNzIwMCwweDAsMHgxMDAwMDAwMCwweDgwODAzMDAwLDB4MTIxMDAwMDAsMHgxMjEwMDAwMCwweDAsMHgwLDB4MCwweDEwMDAwMCwweDAsMHgxMjAwMDAwMCwweDIwMDAsMHgwLDB4MCwweDAsMHgwLDB4MTIxMDAwMDAsMHgxMjEwMDAwMCwweDAsMHgwLDB4MCwweDEyMDAwMDAwLDB4MTIwMDIwMDAsMHgwLDB4MCwweDAsMHgxMjAwMjAwMCwweDIwMDAsMHgwLDB4MjAwMCwweDgwMDAwLDB4ODAwMDAsMHgwLDB4MCwweDgwMDAwLDB4MTIwMDAwMDAsMHgxMjAwMDAwMCwweDAsfTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzEoKSB7Ci0gICAgICBqal9sYTFfMSA9IG5ldyBpbnRbXSB7MHg0LDB4YTQ3ZmZmYiwweDQwLDB4MCwweDAsMHg4MDAwMDU4LDB4ODAwMDA1OCwweGEwMiwweDgwMDAwMTgsMHgwLDB4ODAwMDA1OCwweDAsMHgwLDB4ODAwMDA1OCwweDgwMTJhZGIsMHgwLDB4MCwweDAsMHgwLDB4ODAwMGFkYiwweDAsMHhhMDMsMHg4MDAwYWRiLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDgwMTJhZGIsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NjE1ZTAsMHgwLDB4ODAwODg1OCwweDgwN2JmZmIsMHhhNDdmZmZiLDB4MCwweDAsMHhhNDdmZmZiLDB4YTQ3ZmZmYiwweDAsMHg4MDFhYWRiLDB4ODAxMmFkYiwweDgwMTJhZGIsMHgwLDB4ODAwODg1OCwweDgwMDg4NTgsMHg0MCwweDQwLDB4ODAxMmFkYiwweDAsMHgwLDB4YTQ3ZmZmYiwweDAsMHg0MDAwLDB4MjQwYzAwMCwweDgwMDA4NTgsMHg4MDAwODU4LDB4MCwweDAsMHgwLDB4ODAwLDB4MCwweDQwLDB4ODAwMCwweDAsMHgwLDB4MCwweDAsMHg4MDAwODU4LDB4ODAwMDg1OCwweDAsMHgwLDB4MCwweDQwLDB4NDAsMHgwLDB4MCwweDAsMHg0MCwweDAsMHgwLDB4MCwweDEwMDAwMDAsMHgwLDB4MjAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwLDB4NDAsMHg0MCwweDAsfTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzIoKSB7Ci0gICAgICBqal9sYTFfMiA9IG5ldyBpbnRbXSB7MHgwLDB4ODBhYTYwNWYsMHg0MDAwLDB4NDAwMDAwMCwweDQwMDAwMDAsMHg0MDAwLDB4MjQwMDAsMHgyYTIwNWUsMHgwLDB4MCwweDI0MDQyLDB4MTAwMDAwMCwweDQwMDAwMDAsMHgyNDA0MiwweDgwMmE2MDVlLDB4MTAwMDAwMCwweDAsMHgyMjIwMDAwLDB4MCwweDJhNjA1ZSwweDIyMjAwMDAsMHgyYTIwNWUsMHgyYTYwNWUsMHgwLDB4MjIyMDAwMCwweDgwMDAwMDAsMHgyMDAwMDAwLDB4MjAwMDAwLDB4ODAwMDAwMCwweDIwMDAwLDB4ODAyYTYwNWUsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg2MDAwMDAwMCwweDYwMDAwMDAwLDB4NjAwMDAwMDAsMHg2MDAwMDAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MTAwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDAsMHg4NDAwMCwweDgwMDAwMCwweDQwMDAsMHg4MGFhNjA1ZSwweDgwYWE2MDVmLDB4MCwweDAsMHg4MGFhNjA1ZiwweDgwYWE2MDVmLDB4MCwweDgwMmE2MDVlLDB4ODAyYTYwNWUsMHg4MDJhNjA1ZSwweDAsMHg0MDAwLDB4NDAwMCwweDQwMDAsMHg0MDAwLDB4ODAyYTYwNWUsMHgwLDB4MCwweDgwYWE2MDVmLDB4ODAwMDAwLDB4MCwweDEsMHg0MDAwLDB4NDAwMCwweDEsMHgwLDB4MjAwMDAsMHg1ZSwweDEwMDAwMDAsMHg0MDAwLDB4MCwweDEwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMDAsMHgxMDAwMDAwMCwweDQwMDAsMHg0MDAwLDB4MCwweDAsMHgxMDAwMDAwLDB4NDAwMCwweDgwMDQwMDAsMHgwLDB4MTAwMDAwMCwweDgwMDAwMDAsMHg4MDA0MDAwLDB4MCwweDEwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NDA0MCwweDQwNDAsMHgyMDAwMDAwLH07Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8zKCkgewotICAgICAgampfbGExXzMgPSBuZXcgaW50W10gezB4MCwweDNjMDEsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgzYzAxLDB4MCwweGMwMCwweDAsMHhjMDAsMHgwLDB4MCwweDAsMHgwLDB4YzAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4M2MwMSwweDhjMDAwLDB4OGMwMDAsMHgzMDAwLDB4MzAwMCwweDcwMDAwMCwweDcwMDAwMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4NDgsMHg0OCwweDQ4LDB4MTAwMDAsMHgxMDAwMCwweDQwMDAwLDB4NDAwMDAsMHgyMDAwMCwweDIwMDAwLDB4MTAwLDB4MTAwLDB4ODAsMHg4MCwweDIsMHgyLDB4MiwweDIsMHhmZjgwMDAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDNjMDEsMHgzYzAxLDB4MCwweDAsMHgzYzAxLDB4M2MwMSwweDAsMHgzYzAxLDB4M2MwMSwweDNjMDEsMHgwLDB4MCwweDAsMHgwLDB4MCwweDNjMDEsMHgwLDB4MCwweDNjMDEsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgyLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0LDB4NCwweDAsMHgwLDB4MCwweDQsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCx9OwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfNCgpIHsKLSAgICAgIGpqX2xhMV80ID0gbmV3IGludFtdIHsweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NjAsMHg2MCwweDYwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxZiwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCx9OwotICAgfQotICBmaW5hbCBwcml2YXRlIEpKQ2FsbHNbXSBqal8yX3J0bnMgPSBuZXcgSkpDYWxsc1syOV07Ci0gIHByaXZhdGUgYm9vbGVhbiBqal9yZXNjYW4gPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgampfZ2MgPSAwOwotCi0gIHB1YmxpYyBKU1BhcnNlcjIwKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgIHRoaXMoc3RyZWFtLCBudWxsKTsKLSAgfQotICBwdWJsaWMgSlNQYXJzZXIyMChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgSlNQYXJzZXIyMFRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICBSZUluaXQoc3RyZWFtLCBudWxsKTsKLSAgfQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBlbmNvZGluZykgewotICAgIHRyeSB7IGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTIyOyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIEpTUGFyc2VyMjAoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgSlNQYXJzZXIyMFRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBKU1BhcnNlcjIwKEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjI7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoSlNQYXJzZXIyMFRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgVG9rZW4gampfY29uc3VtZV90b2tlbihpbnQga2luZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBUb2tlbiBvbGRUb2tlbjsKLSAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKLSAgICAgIGpqX2dlbisrOwotICAgICAgaWYgKCsrampfZ2MgPiAxMDApIHsKLSAgICAgICAgampfZ2MgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIEpKQ2FsbHMgYyA9IGpqXzJfcnRuc1tpXTsKLSAgICAgICAgICB3aGlsZSAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYy5nZW4gPCBqal9nZW4pIGMuZmlyc3QgPSBudWxsOwotICAgICAgICAgICAgYyA9IGMubmV4dDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci0gICAgdG9rZW4gPSBvbGRUb2tlbjsKLSAgICBqal9raW5kID0ga2luZDsKLSAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfQotICBmaW5hbCBwcml2YXRlIExvb2thaGVhZFN1Y2Nlc3MgampfbHMgPSBuZXcgTG9va2FoZWFkU3VjY2VzcygpOwotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfc2Nhbl90b2tlbihpbnQga2luZCkgewotICAgIGlmIChqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHsKLSAgICAgIGpqX2xhLS07Ci0gICAgICBpZiAoampfc2NhbnBvcy5uZXh0ID09IG51bGwpIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICB9Ci0gICAgaWYgKGpqX3Jlc2NhbikgewotICAgICAgaW50IGkgPSAwOyBUb2tlbiB0b2sgPSB0b2tlbjsKLSAgICAgIHdoaWxlICh0b2sgIT0gbnVsbCAmJiB0b2sgIT0gampfc2NhbnBvcykgeyBpKys7IHRvayA9IHRvay5uZXh0OyB9Ci0gICAgICBpZiAodG9rICE9IG51bGwpIGpqX2FkZF9lcnJvcl90b2tlbihraW5kLCBpKTsKLSAgICB9Ci0gICAgaWYgKGpqX3NjYW5wb3Mua2luZCAhPSBraW5kKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfbGEgPT0gMCAmJiBqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHRocm93IGpqX2xzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7Ci0gICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbisrOwotICAgIHJldHVybiB0b2tlbjsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKLSAgICBUb2tlbiB0ID0gbG9va2luZ0FoZWFkID8gampfc2NhbnBvcyA6IHRva2VuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgewotICAgICAgaWYgKHQubmV4dCAhPSBudWxsKSB0ID0gdC5uZXh0OwotICAgICAgZWxzZSB0ID0gdC5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIH0KLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgaW50IGpqX250aygpIHsKLSAgICBpZiAoKGpqX250PXRva2VuLm5leHQpID09IG51bGwpCi0gICAgICByZXR1cm4gKGpqX250ayA9ICh0b2tlbi5uZXh0PXRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKSkua2luZCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIChqal9udGsgPSBqal9udC5raW5kKTsKLSAgfQotCi0gIHByaXZhdGUgamF2YS51dGlsLlZlY3RvciBqal9leHBlbnRyaWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgcHJpdmF0ZSBpbnRbXSBqal9leHBlbnRyeTsKLSAgcHJpdmF0ZSBpbnQgampfa2luZCA9IC0xOwotICBwcml2YXRlIGludFtdIGpqX2xhc3R0b2tlbnMgPSBuZXcgaW50WzEwMF07Ci0gIHByaXZhdGUgaW50IGpqX2VuZHBvczsKLQotICBwcml2YXRlIHZvaWQgampfYWRkX2Vycm9yX3Rva2VuKGludCBraW5kLCBpbnQgcG9zKSB7Ci0gICAgaWYgKHBvcyA+PSAxMDApIHJldHVybjsKLSAgICBpZiAocG9zID09IGpqX2VuZHBvcyArIDEpIHsKLSAgICAgIGpqX2xhc3R0b2tlbnNbampfZW5kcG9zKytdID0ga2luZDsKLSAgICB9IGVsc2UgaWYgKGpqX2VuZHBvcyAhPSAwKSB7Ci0gICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbampfZW5kcG9zXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZW5kcG9zOyBpKyspIHsKLSAgICAgICAgampfZXhwZW50cnlbaV0gPSBqal9sYXN0dG9rZW5zW2ldOwotICAgICAgfQotICAgICAgYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLSAgICAgIGZvciAoamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBqal9leHBlbnRyaWVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgIGludFtdIG9sZGVudHJ5ID0gKGludFtdKShlLm5leHRFbGVtZW50KCkpOwotICAgICAgICBpZiAob2xkZW50cnkubGVuZ3RoID09IGpqX2V4cGVudHJ5Lmxlbmd0aCkgewotICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG9sZGVudHJ5W2ldICE9IGpqX2V4cGVudHJ5W2ldKSB7Ci0gICAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGV4aXN0cykgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghZXhpc3RzKSBqal9leHBlbnRyaWVzLmFkZEVsZW1lbnQoampfZXhwZW50cnkpOwotICAgICAgaWYgKHBvcyAhPSAwKSBqal9sYXN0dG9rZW5zWyhqal9lbmRwb3MgPSBwb3MpIC0gMV0gPSBraW5kOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCkgewotICAgIGpqX2V4cGVudHJpZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBib29sZWFuW10gbGExdG9rZW5zID0gbmV3IGJvb2xlYW5bMTM1XTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEzNTsgaSsrKSB7Ci0gICAgICBsYTF0b2tlbnNbaV0gPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGpqX2tpbmQgPj0gMCkgewotICAgICAgbGExdG9rZW5zW2pqX2tpbmRdID0gdHJ1ZTsKLSAgICAgIGpqX2tpbmQgPSAtMTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjI7IGkrKykgewotICAgICAgaWYgKGpqX2xhMVtpXSA9PSBqal9nZW4pIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0gICAgICAgICAgaWYgKChqal9sYTFfMFtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zW2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfMVtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzMyK2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfMltpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzY0K2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfM1tpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzk2K2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfNFtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzEyOCtqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTM1OyBpKyspIHsKLSAgICAgIGlmIChsYTF0b2tlbnNbaV0pIHsKLSAgICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50WzFdOwotICAgICAgICBqal9leHBlbnRyeVswXSA9IGk7Ci0gICAgICAgIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGpqX2VuZHBvcyA9IDA7Ci0gICAgampfcmVzY2FuX3Rva2VuKCk7Ci0gICAgampfYWRkX2Vycm9yX3Rva2VuKDAsIDApOwotICAgIGludFtdW10gZXhwdG9rc2VxID0gbmV3IGludFtqal9leHBlbnRyaWVzLnNpemUoKV1bXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGV4cHRva3NlcVtpXSA9IChpbnRbXSlqal9leHBlbnRyaWVzLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBQYXJzZUV4Y2VwdGlvbih0b2tlbiwgZXhwdG9rc2VxLCB0b2tlbkltYWdlKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIGVuYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZGlzYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3Jlc2Nhbl90b2tlbigpIHsKLSAgICBqal9yZXNjYW4gPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjk7IGkrKykgewotICAgIHRyeSB7Ci0gICAgICBKSkNhbGxzIHAgPSBqal8yX3J0bnNbaV07Ci0gICAgICBkbyB7Ci0gICAgICAgIGlmIChwLmdlbiA+IGpqX2dlbikgewotICAgICAgICAgIGpqX2xhID0gcC5hcmc7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gcC5maXJzdDsKLSAgICAgICAgICBzd2l0Y2ggKGkpIHsKLSAgICAgICAgICAgIGNhc2UgMDogampfM18xKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiBqal8zXzIoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IGpqXzNfMygpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzogampfM180KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OiBqal8zXzUoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDU6IGpqXzNfNigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjogampfM183KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA3OiBqal8zXzgoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg6IGpqXzNfOSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOTogampfM18xMCgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTA6IGpqXzNfMTEoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDExOiBqal8zXzEyKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMjogampfM18xMygpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTM6IGpqXzNfMTQoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0OiBqal8zXzE1KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNTogampfM18xNigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTY6IGpqXzNfMTcoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE3OiBqal8zXzE4KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxODogampfM18xOSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTk6IGpqXzNfMjAoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIwOiBqal8zXzIxKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMTogampfM18yMigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjI6IGpqXzNfMjMoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIzOiBqal8zXzI0KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNDogampfM18yNSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjU6IGpqXzNfMjYoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI2OiBqal8zXzI3KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNzogampfM18yOCgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjg6IGpqXzNfMjkoKTsgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHAgPSBwLm5leHQ7Ci0gICAgICB9IHdoaWxlIChwICE9IG51bGwpOwotICAgICAgfSBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IH0KLSAgICB9Ci0gICAgampfcmVzY2FuID0gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIHZvaWQgampfc2F2ZShpbnQgaW5kZXgsIGludCB4bGEpIHsKLSAgICBKSkNhbGxzIHAgPSBqal8yX3J0bnNbaW5kZXhdOwotICAgIHdoaWxlIChwLmdlbiA+IGpqX2dlbikgewotICAgICAgaWYgKHAubmV4dCA9PSBudWxsKSB7IHAgPSBwLm5leHQgPSBuZXcgSkpDYWxscygpOyBicmVhazsgfQotICAgICAgcCA9IHAubmV4dDsKLSAgICB9Ci0gICAgcC5nZW4gPSBqal9nZW4gKyB4bGEgLSBqal9sYTsgcC5maXJzdCA9IHRva2VuOyBwLmFyZyA9IHhsYTsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBjbGFzcyBKSkNhbGxzIHsKLSAgICBpbnQgZ2VuOwotICAgIFRva2VuIGZpcnN0OwotICAgIGludCBhcmc7Ci0gICAgSkpDYWxscyBuZXh0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBDb25zdGFudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkYzc3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQYXJzZXIyMENvbnN0YW50cy5qYXZhICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQYXJzZXIyMENvbnN0YW50cyB7Ci0KLSAgaW50IEVPRiA9IDA7Ci0gIGludCBFT0wgPSAxOwotICBpbnQgV1MgPSAyOwotICBpbnQgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IDU7Ci0gIGludCBNVUxUSV9MSU5FX0NPTU1FTlQgPSA2OwotICBpbnQgQVMgPSA4OwotICBpbnQgQlJFQUsgPSA5OwotICBpbnQgQ0FTRSA9IDEwOwotICBpbnQgQ0FUQ0ggPSAxMTsKLSAgaW50IENMQVNTID0gMTI7Ci0gIGludCBDT05TVCA9IDEzOwotICBpbnQgQ09OVElOVUUgPSAxNDsKLSAgaW50IF9ERUZBVUxUID0gMTU7Ci0gIGludCBERUxFVEUgPSAxNjsKLSAgaW50IERPID0gMTc7Ci0gIGludCBFTFNFID0gMTg7Ci0gIGludCBFWFRFTkRTID0gMTk7Ci0gIGludCBGQUxTRSA9IDIwOwotICBpbnQgRklOQUxMWSA9IDIxOwotICBpbnQgRk9SID0gMjI7Ci0gIGludCBGVU5DVElPTiA9IDIzOwotICBpbnQgRlVOQ1RJT05fID0gMjQ7Ci0gIGludCBHRVQgPSAyNTsKLSAgaW50IElGID0gMjY7Ci0gIGludCBJTiA9IDI3OwotICBpbnQgSU5DTFVERSA9IDI4OwotICBpbnQgSU5TVEFOQ0VPRiA9IDI5OwotICBpbnQgSVMgPSAzMDsKLSAgaW50IE5BTUVTUEFDRSA9IDMxOwotICBpbnQgTkVXID0gMzI7Ci0gIGludCBOVUxMID0gMzM7Ci0gIGludCBQQUNLQUdFID0gMzQ7Ci0gIGludCBQUklWQVRFID0gMzU7Ci0gIGludCBQVUJMSUMgPSAzNjsKLSAgaW50IFJFVFVSTiA9IDM3OwotICBpbnQgU0VUID0gMzg7Ci0gIGludCBTVVBFUiA9IDM5OwotICBpbnQgU1dJVENIID0gNDA7Ci0gIGludCBUSElTID0gNDE7Ci0gIGludCBUSFJPVyA9IDQyOwotICBpbnQgVFJVRSA9IDQzOwotICBpbnQgVFJZID0gNDQ7Ci0gIGludCBUWVBFT0YgPSA0NTsKLSAgaW50IFVTRSA9IDQ2OwotICBpbnQgVkFSID0gNDc7Ci0gIGludCBWT0lEID0gNDg7Ci0gIGludCBXSElMRSA9IDQ5OwotICBpbnQgV0lUSCA9IDUwOwotICBpbnQgQUJTVFJBQ1QgPSA1MTsKLSAgaW50IERFQlVHR0VSID0gNTI7Ci0gIGludCBFTlVNID0gNTM7Ci0gIGludCBFWFBPUlQgPSA1NDsKLSAgaW50IEdPVE8gPSA1NTsKLSAgaW50IElNUExFTUVOVFMgPSA1NjsKLSAgaW50IElOVEVSRkFDRSA9IDU3OwotICBpbnQgTkFUSVZFID0gNTg7Ci0gIGludCBQUk9URUNURUQgPSA1OTsKLSAgaW50IFNZTkNIUk9OSVpFRCA9IDYwOwotICBpbnQgVEhST1dTID0gNjE7Ci0gIGludCBUUkFOU0lFTlQgPSA2MjsKLSAgaW50IFZPTEFUSUxFID0gNjM7Ci0gIGludCBJTVBPUlQgPSA2NDsKLSAgaW50IERFQ0lNQUxfTElURVJBTCA9IDY1OwotICBpbnQgSEVYX0xJVEVSQUwgPSA2NjsKLSAgaW50IE9DVEFMX0xJVEVSQUwgPSA2NzsKLSAgaW50IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwgPSA2ODsKLSAgaW50IEVYUE9ORU5UID0gNjk7Ci0gIGludCBTVFJJTkdfTElURVJBTCA9IDcwOwotICBpbnQgRVNDQVBFX1NFUVVFTkNFID0gNzE7Ci0gIGludCBVTlRFUk1JTkFURURfU1RSSU5HX0xJVEVSQUwgPSA3MjsKLSAgaW50IFJFR1hfU1RBUlRfQ0hBUiA9IDczOwotICBpbnQgUkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OID0gNzQ7Ci0gIGludCBSRUdYX0JPRFlfQ0hBUiA9IDc1OwotICBpbnQgUkVHRVhfRU5EX0NIQVIgPSA3NjsKLSAgaW50IFJFR1VMQVJfRVhQUkVTU0lPTiA9IDc3OwotICBpbnQgSURFTlRJRklFUiA9IDc4OwotICBpbnQgTEVUVEVSID0gNzk7Ci0gIGludCBESUdJVCA9IDgwOwotICBpbnQgTFBBUkVOID0gODE7Ci0gIGludCBSUEFSRU4gPSA4MjsKLSAgaW50IExCUkFDRSA9IDgzOwotICBpbnQgUkJSQUNFID0gODQ7Ci0gIGludCBMQlJBQ0tFVCA9IDg1OwotICBpbnQgUkJSQUNLRVQgPSA4NjsKLSAgaW50IFNFTUlDT0xPTiA9IDg3OwotICBpbnQgQ09NTUEgPSA4ODsKLSAgaW50IERPVCA9IDg5OwotICBpbnQgUVVBTElGSUVSID0gOTA7Ci0gIGludCBFTElQU0UgPSA5MTsKLSAgaW50IEFTU0lHTiA9IDkyOwotICBpbnQgR1QgPSA5MzsKLSAgaW50IExUID0gOTQ7Ci0gIGludCBCQU5HID0gOTU7Ci0gIGludCBUSUxERSA9IDk2OwotICBpbnQgSE9PSyA9IDk3OwotICBpbnQgQ09MT04gPSA5ODsKLSAgaW50IEVRID0gOTk7Ci0gIGludCBMRSA9IDEwMDsKLSAgaW50IEdFID0gMTAxOwotICBpbnQgTkUgPSAxMDI7Ci0gIGludCBTQ19PUiA9IDEwMzsKLSAgaW50IFNDX0FORCA9IDEwNDsKLSAgaW50IFNDX1hPUiA9IDEwNTsKLSAgaW50IElOQ1IgPSAxMDY7Ci0gIGludCBERUNSID0gMTA3OwotICBpbnQgUExVUyA9IDEwODsKLSAgaW50IE1JTlVTID0gMTA5OwotICBpbnQgU1RBUiA9IDExMDsKLSAgaW50IFNMQVNIID0gMTExOwotICBpbnQgQklUX0FORCA9IDExMjsKLSAgaW50IEJJVF9PUiA9IDExMzsKLSAgaW50IFhPUiA9IDExNDsKLSAgaW50IFJFTSA9IDExNTsKLSAgaW50IExTSElGVCA9IDExNjsKLSAgaW50IFJTSUdORURTSElGVCA9IDExNzsKLSAgaW50IFJVTlNJR05FRFNISUZUID0gMTE4OwotICBpbnQgUExVU0FTU0lHTiA9IDExOTsKLSAgaW50IE1JTlVTQVNTSUdOID0gMTIwOwotICBpbnQgU1RBUkFTU0lHTiA9IDEyMTsKLSAgaW50IFNMQVNIQVNTSUdOID0gMTIyOwotICBpbnQgQU5EQVNTSUdOID0gMTIzOwotICBpbnQgT1JBU1NJR04gPSAxMjQ7Ci0gIGludCBYT1JBU1NJR04gPSAxMjU7Ci0gIGludCBSRU1BU1NJR04gPSAxMjY7Ci0gIGludCBMU0hJRlRBU1NJR04gPSAxMjc7Ci0gIGludCBSU0lHTkVEU0hJRlRBU1NJR04gPSAxMjg7Ci0gIGludCBSVU5TSUdORURTSElGVEFTU0lHTiA9IDEyOTsKLSAgaW50IFNDX09SQVNTSUdOID0gMTMwOwotICBpbnQgU0NfQU5EQVNTSUdOID0gMTMxOwotICBpbnQgU0NfWE9SQVNTSUdOID0gMTMyOwotICBpbnQgSURFTlRJVFlPUEVSID0gMTMzOwotICBpbnQgTk9USURFTlRJVFlPUEVSID0gMTM0OwotCi0gIGludCBERUZBVUxUID0gMDsKLSAgaW50IElOX1NJTkdMRV9MSU5FX0NPTU1FTlQgPSAxOwotICBpbnQgSU5fTVVMVElfTElORV9DT01NRU5UID0gMjsKLQotICBTdHJpbmdbXSB0b2tlbkltYWdlID0gewotICAgICI8RU9GPiIsCi0gICAgIjxFT0w+IiwKLSAgICAiPFdTPiIsCi0gICAgIlwiLy9cIiIsCi0gICAgIlwiLypcIiIsCi0gICAgIjxTSU5HTEVfTElORV9DT01NRU5UPiIsCi0gICAgIlwiKi9cIiIsCi0gICAgIjx0b2tlbiBvZiBraW5kIDc+IiwKLSAgICAiXCJhc1wiIiwKLSAgICAiXCJicmVha1wiIiwKLSAgICAiXCJjYXNlXCIiLAotICAgICJcImNhdGNoXCIiLAotICAgICJcImNsYXNzXCIiLAotICAgICJcImNvbnN0XCIiLAotICAgICJcImNvbnRpbnVlXCIiLAotICAgICJcImRlZmF1bHRcIiIsCi0gICAgIlwiZGVsZXRlXCIiLAotICAgICJcImRvXCIiLAotICAgICJcImVsc2VcIiIsCi0gICAgIlwiZXh0ZW5kc1wiIiwKLSAgICAiXCJmYWxzZVwiIiwKLSAgICAiXCJmaW5hbGx5XCIiLAotICAgICJcImZvclwiIiwKLSAgICAiXCJmdW5jdGlvblwiIiwKLSAgICAiXCJGdW5jdGlvblwiIiwKLSAgICAiXCJnZXRcIiIsCi0gICAgIlwiaWZcIiIsCi0gICAgIlwiaW5cIiIsCi0gICAgIlwiaW5jbHVkZVwiIiwKLSAgICAiXCJpbnN0YW5jZW9mXCIiLAotICAgICJcImlzXCIiLAotICAgICJcIm5hbWVzcGFjZVwiIiwKLSAgICAiXCJuZXdcIiIsCi0gICAgIlwibnVsbFwiIiwKLSAgICAiXCJwYWNrYWdlXCIiLAotICAgICJcInByaXZhdGVcIiIsCi0gICAgIlwicHVibGljXCIiLAotICAgICJcInJldHVyblwiIiwKLSAgICAiXCJzZXRcIiIsCi0gICAgIlwic3VwZXJcIiIsCi0gICAgIlwic3dpdGNoXCIiLAotICAgICJcInRoaXNcIiIsCi0gICAgIlwidGhyb3dcIiIsCi0gICAgIlwidHJ1ZVwiIiwKLSAgICAiXCJ0cnlcIiIsCi0gICAgIlwidHlwZW9mXCIiLAotICAgICJcInVzZVwiIiwKLSAgICAiXCJ2YXJcIiIsCi0gICAgIlwidm9pZFwiIiwKLSAgICAiXCJ3aGlsZVwiIiwKLSAgICAiXCJ3aXRoXCIiLAotICAgICJcImFic3RyYWN0XCIiLAotICAgICJcImRlYnVnZ2VyXCIiLAotICAgICJcImVudW1cIiIsCi0gICAgIlwiZXhwb3J0XCIiLAotICAgICJcImdvdG9cIiIsCi0gICAgIlwiaW1wbGVtZW50c1wiIiwKLSAgICAiXCJpbnRlcmZhY2VcIiIsCi0gICAgIlwibmF0aXZlXCIiLAotICAgICJcInByb3RlY3RlZFwiIiwKLSAgICAiXCJzeW5jaHJvbml6ZWRcIiIsCi0gICAgIlwidGhyb3dzXCIiLAotICAgICJcInRyYW5zaWVudFwiIiwKLSAgICAiXCJ2b2xhdGlsZVwiIiwKLSAgICAiXCJpbXBvcnRcIiIsCi0gICAgIjxERUNJTUFMX0xJVEVSQUw+IiwKLSAgICAiPEhFWF9MSVRFUkFMPiIsCi0gICAgIjxPQ1RBTF9MSVRFUkFMPiIsCi0gICAgIjxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiIsCi0gICAgIjxFWFBPTkVOVD4iLAotICAgICI8U1RSSU5HX0xJVEVSQUw+IiwKLSAgICAiPEVTQ0FQRV9TRVFVRU5DRT4iLAotICAgICI8VU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMPiIsCi0gICAgIjxSRUdYX1NUQVJUX0NIQVI+IiwKLSAgICAiPFJFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTj4iLAotICAgICI8UkVHWF9CT0RZX0NIQVI+IiwKLSAgICAiPFJFR0VYX0VORF9DSEFSPiIsCi0gICAgIjxSRUdVTEFSX0VYUFJFU1NJT04+IiwKLSAgICAiPElERU5USUZJRVI+IiwKLSAgICAiPExFVFRFUj4iLAotICAgICI8RElHSVQ+IiwKLSAgICAiXCIoXCIiLAotICAgICJcIilcIiIsCi0gICAgIlwie1wiIiwKLSAgICAiXCJ9XCIiLAotICAgICJcIltcIiIsCi0gICAgIlwiXVwiIiwKLSAgICAiXCI7XCIiLAotICAgICJcIixcIiIsCi0gICAgIlwiLlwiIiwKLSAgICAiXCI6OlwiIiwKLSAgICAiXCIuLi5cIiIsCi0gICAgIlwiPVwiIiwKLSAgICAiXCI+XCIiLAotICAgICJcIjxcIiIsCi0gICAgIlwiIVwiIiwKLSAgICAiXCJ+XCIiLAotICAgICJcIj9cIiIsCi0gICAgIlwiOlwiIiwKLSAgICAiXCI9PVwiIiwKLSAgICAiXCI8PVwiIiwKLSAgICAiXCI+PVwiIiwKLSAgICAiXCIhPVwiIiwKLSAgICAiXCJ8fFwiIiwKLSAgICAiXCImJlwiIiwKLSAgICAiXCJeXlwiIiwKLSAgICAiXCIrK1wiIiwKLSAgICAiXCItLVwiIiwKLSAgICAiXCIrXCIiLAotICAgICJcIi1cIiIsCi0gICAgIlwiKlwiIiwKLSAgICAiXCIvXCIiLAotICAgICJcIiZcIiIsCi0gICAgIlwifFwiIiwKLSAgICAiXCJeXCIiLAotICAgICJcIiVcIiIsCi0gICAgIlwiPDxcIiIsCi0gICAgIlwiPj5cIiIsCi0gICAgIlwiPj4+XCIiLAotICAgICJcIis9XCIiLAotICAgICJcIi09XCIiLAotICAgICJcIio9XCIiLAotICAgICJcIi89XCIiLAotICAgICJcIiY9XCIiLAotICAgICJcInw9XCIiLAotICAgICJcIl49XCIiLAotICAgICJcIiU9XCIiLAotICAgICJcIjw8PVwiIiwKLSAgICAiXCI+Pj1cIiIsCi0gICAgIlwiPj4+PVwiIiwKLSAgICAiXCJ8fD1cIiIsCi0gICAgIlwiJiY9XCIiLAotICAgICJcIl5ePVwiIiwKLSAgICAiXCI9PT1cIiIsCi0gICAgIlwiIT09XCIiLAotICB9OwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRva2VuTWFuYWdlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRva2VuTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU2ZjM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBUb2tlbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNDYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQYXJzZXIyMFRva2VuTWFuYWdlci5qYXZhICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIgaW1wbGVtZW50cyBKU1BhcnNlcjIwQ29uc3RhbnRzCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIHB1YmxpYyB2b2lkIHNldFJlZ0ludmFsaWQoKQotICAgIHsKLSAgICAgICAgaXNSZWdWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdWYWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gIHB1YmxpYyAgamF2YS5pby5QcmludFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IFN5c3RlbS5vdXQ7Ci0gIHB1YmxpYyAgdm9pZCBzZXREZWJ1Z1N0cmVhbShqYXZhLmlvLlByaW50U3RyZWFtIGRzKSB7IGRlYnVnU3RyZWFtID0gZHM7IH0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTAsIGxvbmcgYWN0aXZlMSwgbG9uZyBhY3RpdmUyKQotewotICAgc3dpdGNoIChwb3MpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDE4TCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDQwMDgwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDEwOwotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhmZmZmZmZmZmZmZmZmZjAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4YTAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDU7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDA3YzAyMDEwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhmZGZmZmZmZjgzZmRmZTAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgIT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGZmZmYyZmJlYjFiZGZlMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyAhPSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZDA0MTAyNDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGZmNWEyNWJjYjFiOWZhMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YTUwYTAyMDAwNDA0MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZGY1ODIxM2NiMWE5YzAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zICE9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAyMDQ4MDAwMTAzYTAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGRiMTgwMDBjYjFhOGMwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDU7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDI0NDAyMTMwMDAwMTAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSA2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhkYjE4MDAwMGExODA0MDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA2OwotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhjMTAyODgwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NWIwMDAwMDBhMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAxODAwMDAwMTgwNDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSA4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMTAwMDAwMDIwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA4OwotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0YTAwMDAwMDgwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDk7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAyMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAxMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTA7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIHJldHVybiAtMTsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTAsIGxvbmcgYWN0aXZlMSwgbG9uZyBhY3RpdmUyKQotewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChwb3MsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpLCBwb3MgKyAxKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RvcEF0UG9zKGludCBwb3MsIGludCBraW5kKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICByZXR1cm4gcG9zICsgMTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoaW50IHBvcywgaW50IGtpbmQsIGludCBzdGF0ZSkKLXsKLSAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgamptYXRjaGVkUG9zID0gcG9zOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgcmV0dXJuIHBvcyArIDE7IH0KLSAgIHJldHVybiBqak1vdmVOZmFfMChzdGF0ZSwgcG9zICsgMSk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8wKCkKLXsKLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAzMzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5NTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4NDAwMDAwMDAwMEwsIDB4NDBMKTsKLSAgICAgIGNhc2UgMzc6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE1OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDAwMDAwMDAwMDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDExMjsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4ODAwMDEwMDAwMDAwMDAwTCwgMHg4TCk7Ci0gICAgICBjYXNlIDQwOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDgxKTsKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODIpOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTA7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDIwMDAwMDAwMDAwMDAwMEwsIDB4MEwpOwotICAgICAgY2FzZSA0MzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDg7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDQwMDAwMDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDQ0OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg4KTsKLSAgICAgIGNhc2UgNDU6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTA5OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgxMDAwODAwMDAwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNDY6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gODk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNDc6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTExOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxOEwsIDB4NDAwMDAwMDAwMDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDU4OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDk4OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDU5OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg3KTsKLSAgICAgIGNhc2UgNjA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gOTQ7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMTAwMDEwMDAwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gOTI7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDAwMDAwMEwsIDB4MjBMKTsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gOTM7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDYwMDAyMDAwMDAwMDAwTCwgMHgzTCk7Ci0gICAgICBjYXNlIDYzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDk3KTsKLSAgICAgIGNhc2UgNzA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgOTE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODUpOwotICAgICAgY2FzZSA5MzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4Nik7Ci0gICAgICBjYXNlIDk0OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDExNDsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MjAwMDAyMDAwMDAwMDAwMEwsIDB4MTBMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMDAwMDAxMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgOTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4N2MwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDAwMDM4MDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NjAwMDAwMDAwYzAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhmMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTAzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMjAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDMwMDAwMDA3YzAwMDAwMEwsIDB4MUwsIDB4MEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDM4MDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMWMwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDFjMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NjAwMDNlMDAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDE4MDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTE5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg2MDAwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDEyMzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4Myk7Ci0gICAgICBjYXNlIDEyNDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTM7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDEwMDAwMDgwMDAwMDAwMDBMLCAweDRMKTsKLSAgICAgIGNhc2UgMTI1OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg0KTsKLSAgICAgIGNhc2UgMTI2OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDk2KTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDIsIDApOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMChsb25nIGFjdGl2ZTAsIGxvbmcgYWN0aXZlMSwgbG9uZyBhY3RpdmUyKQotewotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgwLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwNDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4OEwpOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0MzoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ1OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEwNyk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg4MDAwMDAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4OEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDMpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDU4OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgOTApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDYwOgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDExNjsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg4MDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gOTk7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDEpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDI7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDgwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTE5KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyMSk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTIyKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjMpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjQpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjUpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjYpOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAweDYwTCk7Ci0gICAgICBjYXNlIDYyOgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgyMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDExNzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg0MDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTIsIDB4M0wpOwotICAgICAgY2FzZSA5NDoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MjAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDU7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAweDEwTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDA4MDA0ODAxMDBjMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA5ODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDYxMDIwMTgwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDI2LCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAyMDYwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMDAwMjAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MTAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAyNzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIyMDAwMDAzMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDE3LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwODEwMDAwMDA0MDYwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQ4MDAxODA4MDAwMDAyMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgOCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAzMCwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDkyMDE4MDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTIwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMDAwMDA4MDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEyMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDIwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEyNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwMzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4NEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSwgbG9uZyBvbGQyLCBsb25nIGFjdGl2ZTIpCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkgfCAoYWN0aXZlMiAmPSBvbGQyKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDAsIG9sZDAsIG9sZDEsIG9sZDIpOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMSwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci0gICAgICByZXR1cm4gMjsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA0NjoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDkxKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEyNyk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MUwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEyOCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4NEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4OEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEzMSk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MTBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygyLCAxMzIpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTIgJiAweDIwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTMzKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHg0MEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEzNCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMHgyTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MDAwMDAwMDAwMDAxMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgOTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDAxMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgOTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQxMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA0NiwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDMwMzA4MDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwMDAyMDAxMTAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAxYTA2MDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDE0MDIwODAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4MUwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDIyLCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA0NywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwMDQwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwMDIwMDQwNDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAyNSwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM4LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDY4NDAwMjAwMDA4MDgwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MjAwODAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgMzIsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgNDQsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSwgbG9uZyBvbGQyLCBsb25nIGFjdGl2ZTIpCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkgfCAoYWN0aXZlMiAmPSBvbGQyKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDEsIG9sZDAsIG9sZDEsIG9sZDIpOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMiwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci0gICAgICByZXR1cm4gMzsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMiAmIDB4MkwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDMsIDEyOSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAyMDgyMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMTgwMDgwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNDgsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTAsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTgsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNDMsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMjA4MDgwMDkwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA1MCwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg0MDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMzMsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAyMDAxMDEwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNTMsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA1NSwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDQwMDQwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA0MSwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDMwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwODAxMDAyMDAwNDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwMDIwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxLCBsb25nIG9sZDIsIGxvbmcgYWN0aXZlMikKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSB8IChhY3RpdmUyICY9IG9sZDIpKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgb2xkMCwgb2xkMSwgb2xkMik7IAotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgzLCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Ci0gICAgICByZXR1cm4gNDsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4YzIwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAyMCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDQ5LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDkwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDExLCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwNDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA3OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDksIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMzksIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjQ4MDAyMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCk7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMTIsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4NDAwMDAwMDA4MDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAxMywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAxODEwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDA4MDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTE5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQyOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDMsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSB8IChhY3RpdmUxICY9IG9sZDEpKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgb2xkMCwgb2xkMSwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg0LCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Ci0gICAgICByZXR1cm4gNTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgOTk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDM2LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDA4MDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgMTYsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDU4LCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDQ1LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDAwMDQwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNDAsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweGMwMDAwMDAwMDE4MDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4MjA4MDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCAzNywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgyMDAwNDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTEyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDYxLCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNTQsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA2NCwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg0LCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDQsIG9sZDAsIG9sZDEsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNSwgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiA2OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgyMDAwMDAwODAwMDAwMDBMKTsKLSAgICAgIGNhc2UgOTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDAwMjAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMjgsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDM0LCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAzNSwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg0MTEwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDEwMDAwMDAwMDE4MDAwMDBMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMTksIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDE1LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDQwMDBMKTsKLSAgICAgIGNhc2UgMTIxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDIxLCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDUsIGFjdGl2ZTAsIDBMLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDUsIG9sZDAsIDBMLCAwTCk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDYsIGFjdGl2ZTAsIDBMLCAwTCk7Ci0gICAgICByZXR1cm4gNzsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4MjAwMDAwMDgwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgMTQsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCA2MywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHg4MDAwMDAwMjAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDIzLCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgMjQsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4NTEwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCA1MiwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgNTEsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoNiwgYWN0aXZlMCwgMEwsIDBMKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNiwgb2xkMCwgMEwsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNywgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiA4OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCA1OSwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDgsIDMxLCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCA1NywgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAweDIwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOCwgNjIsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg3LCBhY3RpdmUwLCAwTCwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg3LCBvbGQwLCAwTCwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg4LCBhY3RpdmUwLCAwTCwgMEwpOwotICAgICAgcmV0dXJuIDk7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOSwgMjksIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOSwgNTYsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg4LCBhY3RpdmUwLCAwTCwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoOCwgb2xkMCwgMEwsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoOSwgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiAxMDsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg5LCBhY3RpdmUwLCAwTCwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoOSwgb2xkMCwgMEwsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMTAsIGFjdGl2ZTAsIDBMLCAwTCk7Ci0gICAgICByZXR1cm4gMTE7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxMSwgNjAsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMTAsIGFjdGl2ZTAsIDBMLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGQoaW50IHN0YXRlKQotewotICAgaWYgKGpqcm91bmRzW3N0YXRlXSAhPSBqanJvdW5kKQotICAgewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gc3RhdGU7Ci0gICAgICBqanJvdW5kc1tzdGF0ZV0gPSBqanJvdW5kOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IGpqbmV4dFN0YXRlc1tzdGFydF07Ci0gICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRUd29TdGF0ZXMoaW50IHN0YXRlMSwgaW50IHN0YXRlMikKLXsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMSk7Ci0gICBqakNoZWNrTkFkZChzdGF0ZTIpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCkKLXsKLSAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0ICsgMV0pOwotfQotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzAgPSB7Ci0gICAweDBMLCAweDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19OwotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpCi17Ci0gICBpbnRbXSBuZXh0U3RhdGVzOwotICAgaW50IHN0YXJ0c0F0ID0gMDsKLSAgIGpqbmV3U3RhdGVDbnQgPSAxMjQ7Ci0gICBpbnQgaSA9IDE7Ci0gICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKLSAgIGludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsKLSAgIGZvciAoOzspCi0gICB7Ci0gICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCi0gICAgICAgICBSZUluaXRSb3VuZHMoKTsKLSAgICAgIGlmIChjdXJDaGFyIDwgNjQpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgMyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgoMHgxMDAwMDAyMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQsIDEyKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTMsIDE4KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDc4KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc4OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE5LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ2KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZlMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NTsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0OCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjcpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjc7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0MywgNDUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGRmZmY3YmZmZmZmZmRiZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMSwgMjMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDE7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDIwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNSwgNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE5LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZjdmZmZmZmZmZGJmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3NzsKLSAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI0LCAyNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSAzNikKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDEwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzIsIDMzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDQ2KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzQsIDM1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzNCwgMzUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzgsIDM5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDgpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0MywgNDUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKLSAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDQ0OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMywgMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmRiZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkgJiYga2luZCA+IDcwKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzEsIDM0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDU0OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1Nyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjgsIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2MDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2MTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZkYmZmTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyNDAwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM4LCA0MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2OTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDY3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3MToKLSAgICAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNzIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzU7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQsIDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZkYmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0ICYmIGtpbmQgPiA3MCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ1LCA0OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA4NTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDgzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoODgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQyLCA0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDk2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTIsIDU1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTAyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEwMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTA1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTA4OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmRiZmZMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTYsIDU4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1OSwgNjIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICAgICAgICBjYXNlIDEyMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMTkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMjI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMSwgMjMpOwotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNjMsIDY0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMjgwMDAwMDAwMDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDc3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc3OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNjUsIDY4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwMyAmJiBraW5kID4gNzcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzc7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkgJiYga2luZCA+IDc3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc3OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNjksIDcyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSAmJiBraW5kID4gNzcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzc7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg3MywgNzYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDc3LCA3OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDc5LCA4MCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDgxLCA4NSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTQ0MDQ0MzgwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTIwKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1Nyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1OTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjA7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDYxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg4NiwgOTApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDM4MDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyMCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDcxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNzIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDczOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE3KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzQ7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDc1OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3NjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3OToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoOTEsIDk1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgxNDQwNDQzODAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQyLCA0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA4NzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDg4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDkwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA5MTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDk2LCAxMDIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDM4MDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDQ7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEwNSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwNzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwODsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTExOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxMDMsIDEwNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTEyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDM4MDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTYsIDU4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTg7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE4OgotICAgICAgICAgICAgICAgY2FzZSAxMjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDExOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyMDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMSwgMjMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjgsIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoampiaXRWZWMwW2kyXSAmIGwyKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgIHsKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOwotICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICB9Ci0gICAgICArK2N1clBvczsKLSAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDEyNCAtIChqam5ld1N0YXRlQ250ID0gc3RhcnRzQXQpKSkKLSAgICAgICAgIHJldHVybiBjdXJQb3M7Ci0gICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gY3VyUG9zOyB9Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8yKCkKLXsKLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8yKDB4NDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIDE7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8yKGxvbmcgYWN0aXZlMCkKLXsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gMjsKLSAgIH0KLSAgIHJldHVybiAyOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpCi17Ci0gICByZXR1cm4gampNb3ZlTmZhXzEoNCwgMCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMShpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykKLXsKLSAgIGludFtdIG5leHRTdGF0ZXM7Ci0gICBpbnQgc3RhcnRzQXQgPSAwOwotICAgampuZXdTdGF0ZUNudCA9IDQ7Ci0gICBpbnQgaSA9IDE7Ci0gICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKLSAgIGludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsKLSAgIGZvciAoOzspCi0gICB7Ci0gICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCi0gICAgICAgICBSZUluaXRSb3VuZHMoKTsKLSAgICAgIGlmIChjdXJDaGFyIDwgNjQpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmZmZmZkYmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMDgsIDExMCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgoMHgyNDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmZmZmZkYmZmTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwOCwgMTEwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI0MDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAgJiYga2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTMpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyQ2hhciA8IDEyOCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwOCwgMTEwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwOCwgMTEwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGlmIChraW5kICE9IDB4N2ZmZmZmZmYpCi0gICAgICB7Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IGN1clBvczsKLSAgICAgICAgIGtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgfQotICAgICAgKytjdXJQb3M7Ci0gICAgICBpZiAoKGkgPSBqam5ld1N0YXRlQ250KSA9PSAoc3RhcnRzQXQgPSA0IC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQotICAgICAgICAgcmV0dXJuIGN1clBvczsKLSAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBjdXJQb3M7IH0KLSAgIH0KLX0KLXN0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7Ci0gICAzMiwgMzMsIDM4LCAzOSwgNzgsIDc5LCA4MSwgOTMsIDgxLCAxMTAsIDExMSwgNjUsIDk0LCA0NywgNDgsIDUwLCAKLSAgIDYyLCA2MywgNjUsIDEwLCAyOCwgMTEsIDEzLCAxNCwgMTUsIDE2LCAyMSwgMjUsIDQ3LCA0OCwgNTAsIDQ3LCAKLSAgIDQ4LCA1MiwgNTAsIDYyLCA2MywgNjUsIDYyLCA2MywgNjcsIDY1LCA3OCwgNzksIDgxLCA3OCwgNzksIDgzLCAKLSAgIDgxLCA5MywgODEsIDk0LCA5MywgMTAwLCA4MSwgOTQsIDExMCwgMTExLCA2NSwgMTEwLCAxMTEsIDExNCwgNjUsIDcsIAotICAgOCwgMTcsIDE4LCAxOSwgMjAsIDIyLCAxOCwgMjMsIDI0LCAyMiwgMTcsIDI2LCAyNywgMzYsIDM3LCA0MCwgCi0gICA0MSwgNDksIDUxLCA1MywgNTUsIDU4LCA2NCwgNjYsIDY4LCA3MCwgNzMsIDgwLCA4MiwgODQsIDg2LCA4OSwgCi0gICA5NSwgOTcsIDk4LCA5OSwgMTAxLCAxMDMsIDEwNiwgMTEyLCAxMTMsIDExNSwgMTE3LCAxMjAsIDAsIDEsIDMsIAotfTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gampzdHJMaXRlcmFsSW1hZ2VzID0gewotIiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJcMTQxXDE2MyIsIAotIlwxNDJcMTYyXDE0NVwxNDFcMTUzIiwgIlwxNDNcMTQxXDE2M1wxNDUiLCAiXDE0M1wxNDFcMTY0XDE0M1wxNTAiLCAiXDE0M1wxNTRcMTQxXDE2M1wxNjMiLCAKLSJcMTQzXDE1N1wxNTZcMTYzXDE2NCIsICJcMTQzXDE1N1wxNTZcMTY0XDE1MVwxNTZcMTY1XDE0NSIsICJcMTQ0XDE0NVwxNDZcMTQxXDE2NVwxNTRcMTY0IiwgCi0iXDE0NFwxNDVcMTU0XDE0NVwxNjRcMTQ1IiwgIlwxNDRcMTU3IiwgIlwxNDVcMTU0XDE2M1wxNDUiLCAiXDE0NVwxNzBcMTY0XDE0NVwxNTZcMTQ0XDE2MyIsIAotIlwxNDZcMTQxXDE1NFwxNjNcMTQ1IiwgIlwxNDZcMTUxXDE1NlwxNDFcMTU0XDE1NFwxNzEiLCAiXDE0NlwxNTdcMTYyIiwgCi0iXDE0NlwxNjVcMTU2XDE0M1wxNjRcMTUxXDE1N1wxNTYiLCAiXDEwNlwxNjVcMTU2XDE0M1wxNjRcMTUxXDE1N1wxNTYiLCAiXDE0N1wxNDVcMTY0IiwgIlwxNTFcMTQ2IiwgIlwxNTFcMTU2IiwgCi0iXDE1MVwxNTZcMTQzXDE1NFwxNjVcMTQ0XDE0NSIsICJcMTUxXDE1NlwxNjNcMTY0XDE0MVwxNTZcMTQzXDE0NVwxNTdcMTQ2IiwgIlwxNTFcMTYzIiwgCi0iXDE1NlwxNDFcMTU1XDE0NVwxNjNcMTYwXDE0MVwxNDNcMTQ1IiwgIlwxNTZcMTQ1XDE2NyIsICJcMTU2XDE2NVwxNTRcMTU0IiwgIlwxNjBcMTQxXDE0M1wxNTNcMTQxXDE0N1wxNDUiLCAKLSJcMTYwXDE2MlwxNTFcMTY2XDE0MVwxNjRcMTQ1IiwgIlwxNjBcMTY1XDE0MlwxNTRcMTUxXDE0MyIsICJcMTYyXDE0NVwxNjRcMTY1XDE2MlwxNTYiLCAiXDE2M1wxNDVcMTY0IiwgCi0iXDE2M1wxNjVcMTYwXDE0NVwxNjIiLCAiXDE2M1wxNjdcMTUxXDE2NFwxNDNcMTUwIiwgIlwxNjRcMTUwXDE1MVwxNjMiLCAiXDE2NFwxNTBcMTYyXDE1N1wxNjciLCAKLSJcMTY0XDE2MlwxNjVcMTQ1IiwgIlwxNjRcMTYyXDE3MSIsICJcMTY0XDE3MVwxNjBcMTQ1XDE1N1wxNDYiLCAiXDE2NVwxNjNcMTQ1IiwgIlwxNjZcMTQxXDE2MiIsIAotIlwxNjZcMTU3XDE1MVwxNDQiLCAiXDE2N1wxNTBcMTUxXDE1NFwxNDUiLCAiXDE2N1wxNTFcMTY0XDE1MCIsIAotIlwxNDFcMTQyXDE2M1wxNjRcMTYyXDE0MVwxNDNcMTY0IiwgIlwxNDRcMTQ1XDE0MlwxNjVcMTQ3XDE0N1wxNDVcMTYyIiwgIlwxNDVcMTU2XDE2NVwxNTUiLCAKLSJcMTQ1XDE3MFwxNjBcMTU3XDE2MlwxNjQiLCAiXDE0N1wxNTdcMTY0XDE1NyIsICJcMTUxXDE1NVwxNjBcMTU0XDE0NVwxNTVcMTQ1XDE1NlwxNjRcMTYzIiwgCi0iXDE1MVwxNTZcMTY0XDE0NVwxNjJcMTQ2XDE0MVwxNDNcMTQ1IiwgIlwxNTZcMTQxXDE2NFwxNTFcMTY2XDE0NSIsICJcMTYwXDE2MlwxNTdcMTY0XDE0NVwxNDNcMTY0XDE0NVwxNDQiLCAKLSJcMTYzXDE3MVwxNTZcMTQzXDE1MFwxNjJcMTU3XDE1NlwxNTFcMTcyXDE0NVwxNDQiLCAiXDE2NFwxNTBcMTYyXDE1N1wxNjdcMTYzIiwgIlwxNjRcMTYyXDE0MVwxNTZcMTYzXDE1MVwxNDVcMTU2XDE2NCIsIAotIlwxNjZcMTU3XDE1NFwxNDFcMTY0XDE1MVwxNTRcMTQ1IiwgIlwxNTFcMTU1XDE2MFwxNTdcMTYyXDE2NCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIAotbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlw1MCIsICJcNTEiLCAiXDE3MyIsICJcMTc1IiwgCi0iXDEzMyIsICJcMTM1IiwgIlw3MyIsICJcNTQiLCAiXDU2IiwgIlw3Mlw3MiIsICJcNTZcNTZcNTYiLCAiXDc1IiwgIlw3NiIsICJcNzQiLCAKLSJcNDEiLCAiXDE3NiIsICJcNzciLCAiXDcyIiwgIlw3NVw3NSIsICJcNzRcNzUiLCAiXDc2XDc1IiwgIlw0MVw3NSIsICJcMTc0XDE3NCIsIAotIlw0Nlw0NiIsICJcMTM2XDEzNiIsICJcNTNcNTMiLCAiXDU1XDU1IiwgIlw1MyIsICJcNTUiLCAiXDUyIiwgIlw1NyIsICJcNDYiLCAiXDE3NCIsIAotIlwxMzYiLCAiXDQ1IiwgIlw3NFw3NCIsICJcNzZcNzYiLCAiXDc2XDc2XDc2IiwgIlw1M1w3NSIsICJcNTVcNzUiLCAiXDUyXDc1IiwgCi0iXDU3XDc1IiwgIlw0Nlw3NSIsICJcMTc0XDc1IiwgIlwxMzZcNzUiLCAiXDQ1XDc1IiwgIlw3NFw3NFw3NSIsICJcNzZcNzZcNzUiLCAKLSJcNzZcNzZcNzZcNzUiLCAiXDE3NFwxNzRcNzUiLCAiXDQ2XDQ2XDc1IiwgIlwxMzZcMTM2XDc1IiwgIlw3NVw3NVw3NSIsICJcNDFcNzVcNzUiLCB9OwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXhTdGF0ZU5hbWVzID0gewotICAgIkRFRkFVTFQiLCAKLSAgICJJTl9TSU5HTEVfTElORV9DT01NRU5UIiwgCi0gICAiSU5fTVVMVElfTElORV9DT01NRU5UIiwgCi19OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBqam5ld0xleFN0YXRlID0gewotICAgLTEsIC0xLCAtMSwgMSwgMiwgMCwgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7Ci0gICAweGZmZmZmZmZmZmZmZmZmMDFMLCAweGZmZmZmZmZmZmZmZTYxNWZMLCAweDdmTCwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU2tpcCA9IHsKLSAgIDB4NjZMLCAweDBMLCAweDBMLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9TcGVjaWFsID0gewotICAgMHg2NkwsIDB4MEwsIDB4MEwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b01vcmUgPSB7Ci0gICAweDk4TCwgMHgwTCwgMHgwTCwgCi19OwotcHJvdGVjdGVkIFNpbXBsZUNoYXJTdHJlYW0gaW5wdXRfc3RyZWFtOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanJvdW5kcyA9IG5ldyBpbnRbMTI0XTsKLXByaXZhdGUgZmluYWwgaW50W10gampzdGF0ZVNldCA9IG5ldyBpbnRbMjQ4XTsKLVN0cmluZ0J1ZmZlciBpbWFnZTsKLWludCBqamltYWdlTGVuOwotaW50IGxlbmd0aE9mTWF0Y2g7Ci1wcm90ZWN0ZWQgY2hhciBjdXJDaGFyOwotcHVibGljIEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pewotICAgaWYgKFNpbXBsZUNoYXJTdHJlYW0uc3RhdGljRmxhZykKLSAgICAgIHRocm93IG5ldyBFcnJvcigiRVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLiIpOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotfQotcHVibGljIEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSl7Ci0gICB0aGlzKHN0cmVhbSk7Ci0gICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pCi17Ci0gICBqam1hdGNoZWRQb3MgPSBqam5ld1N0YXRlQ250ID0gMDsKLSAgIGN1ckxleFN0YXRlID0gZGVmYXVsdExleFN0YXRlOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotICAgUmVJbml0Um91bmRzKCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgUmVJbml0Um91bmRzKCkKLXsKLSAgIGludCBpOwotICAgampyb3VuZCA9IDB4ODAwMDAwMDE7Ci0gICBmb3IgKGkgPSAxMjQ7IGktLSA+IDA7KQotICAgICAgampyb3VuZHNbaV0gPSAweDgwMDAwMDAwOwotfQotcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCi17Ci0gICBSZUluaXQoc3RyZWFtKTsKLSAgIFN3aXRjaFRvKGxleFN0YXRlKTsKLX0KLXB1YmxpYyB2b2lkIFN3aXRjaFRvKGludCBsZXhTdGF0ZSkKLXsKLSAgIGlmIChsZXhTdGF0ZSA+PSAzIHx8IGxleFN0YXRlIDwgMCkKLSAgICAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKCJFcnJvcjogSWdub3JpbmcgaW52YWxpZCBsZXhpY2FsIHN0YXRlIDogIiArIGxleFN0YXRlICsgIi4gU3RhdGUgdW5jaGFuZ2VkLiIsIFRva2VuTWdyRXJyb3IuSU5WQUxJRF9MRVhJQ0FMX1NUQVRFKTsKLSAgIGVsc2UKLSAgICAgIGN1ckxleFN0YXRlID0gbGV4U3RhdGU7Ci19Ci0KLXByb3RlY3RlZCBUb2tlbiBqakZpbGxUb2tlbigpCi17Ci0gICBUb2tlbiB0ID0gVG9rZW4ubmV3VG9rZW4oamptYXRjaGVkS2luZCk7Ci0gICB0LmtpbmQgPSBqam1hdGNoZWRLaW5kOwotICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDApCi0gICB7Ci0gICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgIHQuaW1hZ2UgPSAiIjsKLSAgICAgIGVsc2UKLSAgICAgICAgIHQuaW1hZ2UgPSBpbWFnZS50b1N0cmluZygpOwotICAgICAgdC5iZWdpbkxpbmUgPSB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7Ci0gICAgICB0LmJlZ2luQ29sdW1uID0gdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKLSAgICAgIHQuaW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOwotICAgICAgdC5iZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7Ci0gICAgICB0LmJlZ2luQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luQ29sdW1uKCk7Ci0gICAgICB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgICAgdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICB9Ci0gICByZXR1cm4gdDsKLX0KLQotaW50IGN1ckxleFN0YXRlID0gMDsKLWludCBkZWZhdWx0TGV4U3RhdGUgPSAwOwotaW50IGpqbmV3U3RhdGVDbnQ7Ci1pbnQgampyb3VuZDsKLWludCBqam1hdGNoZWRQb3M7Ci1pbnQgamptYXRjaGVkS2luZDsKLQotcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIAotewotICBpbnQga2luZDsKLSAgVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsKLSAgVG9rZW4gbWF0Y2hlZFRva2VuOwotICBpbnQgY3VyUG9zID0gMDsKLQotICBFT0ZMb29wIDoKLSAgZm9yICg7OykKLSAgeyAgIAotICAgdHJ5ICAgCi0gICB7ICAgICAKLSAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOwotICAgfSAgICAgCi0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCi0gICB7ICAgICAgICAKLSAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOwotICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOwotICAgfQotICAgaW1hZ2UgPSBudWxsOwotICAgamppbWFnZUxlbiA9IDA7Ci0KLSAgIGZvciAoOzspCi0gICB7Ci0gICAgIHN3aXRjaChjdXJMZXhTdGF0ZSkKLSAgICAgewotICAgICAgIGNhc2UgMDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKLSAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgMToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA1OwotICAgICAgICAgamptYXRjaGVkUG9zID0gLTE7Ci0gICAgICAgICBjdXJQb3MgPSAwOwotICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpOwotICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDAgfHwgKGpqbWF0Y2hlZFBvcyA9PSAwICYmIGpqbWF0Y2hlZEtpbmQgPiA3KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgMjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKLSAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzIoKTsKLSAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPT0gMCAmJiBqam1hdGNoZWRLaW5kID4gNykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLSAgICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgewotICAgICAgICBpZiAoamptYXRjaGVkUG9zICsgMSA8IGN1clBvcykKLSAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKLSAgICAgICAgaWYgKChqanRvVG9rZW5bamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKLSAgICAgICAgewotICAgICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICAgICBUb2tlbkxleGljYWxBY3Rpb25zKG1hdGNoZWRUb2tlbik7Ci0gICAgICAgaWYgKGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF0gIT0gLTEpCi0gICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07Ci0gICAgICAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKGpqdG9Ta2lwW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKChqanRvU3BlY2lhbFtqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICAgICAgICAgIGlmIChzcGVjaWFsVG9rZW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgc3BlY2lhbFRva2VuID0gbWF0Y2hlZFRva2VuOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgICAgICAgICAgc3BlY2lhbFRva2VuID0gKHNwZWNpYWxUb2tlbi5uZXh0ID0gbWF0Y2hlZFRva2VuKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBTa2lwTGV4aWNhbEFjdGlvbnMobWF0Y2hlZFRva2VuKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICBTa2lwTGV4aWNhbEFjdGlvbnMobnVsbCk7Ci0gICAgICAgICBpZiAoampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXSAhPSAtMSkKLSAgICAgICAgICAgY3VyTGV4U3RhdGUgPSBqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdOwotICAgICAgICAgICBjb250aW51ZSBFT0ZMb29wOwotICAgICAgICB9Ci0gICAgICAgIGpqaW1hZ2VMZW4gKz0gamptYXRjaGVkUG9zICsgMTsKLSAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQotICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07Ci0gICAgICAgIGN1clBvcyA9IDA7Ci0gICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgICB0cnkgewotICAgICAgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7Ci0gICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7IH0KLSAgICAgfQotICAgICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICAgIGludCBlcnJvcl9jb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7Ci0gICAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOwotICAgICB0cnkgeyBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfQotICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICBFT0ZTZWVuID0gdHJ1ZTsKLSAgICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7Ci0gICAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7Ci0gICAgICAgICAgIGVycm9yX2xpbmUrKzsKLSAgICAgICAgICAgZXJyb3JfY29sdW1uID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGVycm9yX2NvbHVtbisrOwotICAgICB9Ci0gICAgIGlmICghRU9GU2VlbikgewotICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOwotICAgICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgICAgfQotICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcihFT0ZTZWVuLCBjdXJMZXhTdGF0ZSwgZXJyb3JfbGluZSwgZXJyb3JfY29sdW1uLCBlcnJvcl9hZnRlciwgY3VyQ2hhciwgVG9rZW5NZ3JFcnJvci5MRVhJQ0FMX0VSUk9SKTsKLSAgIH0KLSAgfQotfQotCi12b2lkIFNraXBMZXhpY2FsQWN0aW9ucyhUb2tlbiBtYXRjaGVkVG9rZW4pCi17Ci0gICBzd2l0Y2goamptYXRjaGVkS2luZCkKLSAgIHsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci19Ci12b2lkIFRva2VuTGV4aWNhbEFjdGlvbnMoVG9rZW4gbWF0Y2hlZFRva2VuKQotewotICAgc3dpdGNoKGpqbWF0Y2hlZEtpbmQpCi0gICB7Ci0gICAgICBjYXNlIDc3IDoKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICAgICAgICBpbWFnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGltYWdlLmFwcGVuZChpbnB1dF9zdHJlYW0uR2V0U3VmZml4KGpqaW1hZ2VMZW4gKyAobGVuZ3RoT2ZNYXRjaCA9IGpqbWF0Y2hlZFBvcyArIDEpKSk7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gUGVlayBhdCB0aGUgbmV4dCBjaGFyYWN0ZXIuCi0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsKLSAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOwotICAgICAgICAgICAgICAgIGlmIChpc1JlZ1ZhbGlkID09IGZhbHNlIHx8IG5leHRDaCA9PSAnLycgfHwgbmV4dENoID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBMZXhlY2FsIGFuYWx5c2VyIHRoaW5rcyBpdCBpcyBhIFJFCi0gICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yIHN1Y2ggYXMgLy4uLi4uLwotICAgICAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIGV2ZXJ5dGhpbmcgdG8gdGhlIGZpcnN0ICIvIiBiYWNrIG9uIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChsZW5ndGhPZk1hdGNoLTEpOwotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBBbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHRva2VuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUb2tlbi5pbWFnZSA9IG1hdGNoZWRUb2tlbi5pbWFnZS5zdWJzdHJpbmcoMCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlLmRlbGV0ZSgwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBpbWFnZS5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmtpbmQ9U0xBU0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6IAotICAgICAgICAgYnJlYWs7Ci0gICB9Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBUcmVlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTQwMTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIC5cSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQYXJzZXIyMFRyZWVDb25zdGFudHMKLXsKLSAgcHVibGljIGludCBKSlRQUk9HUkFNID0gMDsKLSAgcHVibGljIGludCBKSlRJREVOVElGSUVSID0gMTsKLSAgcHVibGljIGludCBKSlRTSU1QTEVRVUFMSUZJRURJREVOVElGSUVSID0gMjsKLSAgcHVibGljIGludCBKSlRFWFBSRVNTSU9OUVVBTElGSUVESURFTlRJRklFUiA9IDM7Ci0gIHB1YmxpYyBpbnQgSkpUUVVBTElGSUVESURFTlRJRklFUiA9IDQ7Ci0gIHB1YmxpYyBpbnQgSkpUUFJJTUFSWUVYUFJFU1NJT04gPSA1OwotICBwdWJsaWMgaW50IEpKVFJFU0VSVkVETkFNRVNQQUNFID0gNjsKLSAgcHVibGljIGludCBKSlRGVU5DVElPTkVYUFJFU1NJT04gPSA3OwotICBwdWJsaWMgaW50IEpKVE9CSkVDVExJVEVSQUwgPSA4OwotICBwdWJsaWMgaW50IEpKVEZJRUxETElTVCA9IDk7Ci0gIHB1YmxpYyBpbnQgSkpUTElURVJBTEZJRUxEID0gMTA7Ci0gIHB1YmxpYyBpbnQgSkpURklFTEROQU1FID0gMTE7Ci0gIHB1YmxpYyBpbnQgSkpUQVJSQVlMSVRFUkFMID0gMTI7Ci0gIHB1YmxpYyBpbnQgSkpURUxFTUVOVExJU1QgPSAxMzsKLSAgcHVibGljIGludCBKSlRMSVRFUkFMRUxFTUVOVCA9IDE0OwotICBwdWJsaWMgaW50IEpKVFNVUEVSRVhQUkVTU0lPTiA9IDE1OwotICBwdWJsaWMgaW50IEpKVFBPU1RGSVhFWFBSRVNTSU9OID0gMTY7Ci0gIHB1YmxpYyBpbnQgSkpUQVRUUklCVVRFRVhQUkVTU0lPTiA9IDE3OwotICBwdWJsaWMgaW50IEpKVEZVTExQT1NURklYRVhQUkVTU0lPTiA9IDE4OwotICBwdWJsaWMgaW50IEpKVEZVTExORVdFWFBSRVNTSU9OID0gMTk7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05DT05TVFJVQ1RPUiA9IDIwOwotICBwdWJsaWMgaW50IEpKVEZVTExORVdTVUJFWFBSRVNTSU9OID0gMjE7Ci0gIHB1YmxpYyBpbnQgSkpUUE9TVEZJWE9QID0gMjI7Ci0gIHB1YmxpYyBpbnQgSkpUUFJPUEVSVFlPUkFSR1VNRU5UUyA9IDIzOwotICBwdWJsaWMgaW50IEpKVFBST1BFUlRZT1BFUkFUT1IgPSAyNDsKLSAgcHVibGljIGludCBKSlRBUkdVTUVOVFMgPSAyNTsKLSAgcHVibGljIGludCBKSlRVTkFSWUVYUFJFU1NJT04gPSAyNjsKLSAgcHVibGljIGludCBKSlRNVUxPUCA9IDI3OwotICBwdWJsaWMgaW50IEpKVE1VTFRJUExJQ0FUSVZFRVhQUkVTU0lPTiA9IDI4OwotICBwdWJsaWMgaW50IEpKVEFERE9QID0gMjk7Ci0gIHB1YmxpYyBpbnQgSkpUQURESVRJVkVFWFBSRVNTSU9OID0gMzA7Ci0gIHB1YmxpYyBpbnQgSkpUU0hJRlRPUCA9IDMxOwotICBwdWJsaWMgaW50IEpKVFNISUZURVhQUkVTU0lPTiA9IDMyOwotICBwdWJsaWMgaW50IEpKVFJFTE9QID0gMzM7Ci0gIHB1YmxpYyBpbnQgSkpUUkVMQVRJT05BTEVYUFJFU1NJT04gPSAzNDsKLSAgcHVibGljIGludCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTk5PSU4gPSAzNTsKLSAgcHVibGljIGludCBKSlRFUVVBTE9QID0gMzY7Ci0gIHB1YmxpYyBpbnQgSkpURVFVQUxJVFlFWFBSRVNTSU9OID0gMzc7Ci0gIHB1YmxpYyBpbnQgSkpURVFVQUxJVFlFWFBSRVNTSU9OTk9JTiA9IDM4OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VBTkRPUCA9IDM5OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OID0gNDA7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRUFOREVYUFJFU1NJT05OT0lOID0gNDE7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRVhPUk9QID0gNDI7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRVhPUkVYUFJFU1NJT04gPSA0MzsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFWE9SRVhQUkVTU0lPTk5PSU4gPSA0NDsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFT1JPUCA9IDQ1OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VPUkVYUFJFU1NJT04gPSA0NjsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OTk9JTiA9IDQ3OwotICBwdWJsaWMgaW50IEpKVExPR0lDQUxBTkRFWFBSRVNTSU9OID0gNDg7Ci0gIHB1YmxpYyBpbnQgSkpUTE9HSUNBTEFOREVYUFJFU1NJT05OT0lOID0gNDk7Ci0gIHB1YmxpYyBpbnQgSkpUTE9HSUNBTE9SRVhQUkVTU0lPTiA9IDUwOwotICBwdWJsaWMgaW50IEpKVExPR0lDQUxPUkVYUFJFU1NJT05OT0lOID0gNTE7Ci0gIHB1YmxpYyBpbnQgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OID0gNTI7Ci0gIHB1YmxpYyBpbnQgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OTk9JTiA9IDUzOwotICBwdWJsaWMgaW50IEpKVE5PTkFTU0lHTk1FTlRFWFBSRVNTSU9OID0gNTQ7Ci0gIHB1YmxpYyBpbnQgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOID0gNTU7Ci0gIHB1YmxpYyBpbnQgSkpUQVNTSUdORU1FTlRPUEVSQVRPUiA9IDU2OwotICBwdWJsaWMgaW50IEpKVEFTU0lHTk1FTlRFWFBSRVNTSU9OID0gNTc7Ci0gIHB1YmxpYyBpbnQgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOID0gNTg7Ci0gIHB1YmxpYyBpbnQgSkpUTElTVEVYUFJFU1NJT04gPSA1OTsKLSAgcHVibGljIGludCBKSlRMSVNURVhQUkVTU0lPTk5PSU4gPSA2MDsKLSAgcHVibGljIGludCBKSlRUWVBFRVhQUkVTU0lPTiA9IDYxOwotICBwdWJsaWMgaW50IEpKVFRZUEVFWFBSRVNTSU9OTk9JTiA9IDYyOwotICBwdWJsaWMgaW50IEpKVFRZUEVFWFBSRVNTSU9OTElTVCA9IDYzOwotICBwdWJsaWMgaW50IEpKVFNUQVRFTUVOVCA9IDY0OwotICBwdWJsaWMgaW50IEpKVFNVQlNUQVRFTUVOVCA9IDY1OwotICBwdWJsaWMgaW50IEpKVFNVQlNUQVRFTUVOVFMgPSA2NjsKLSAgcHVibGljIGludCBKSlRTQyA9IDY3OwotICBwdWJsaWMgaW50IEpKVEVPTENPTU1FTlRTS0lQV1MgPSA2ODsKLSAgcHVibGljIGludCBKSlRFTVBUWVNUQVRFTUVOVCA9IDY5OwotICBwdWJsaWMgaW50IEpKVEVYUFJFU1NJT05TVEFURU1FTlQgPSA3MDsKLSAgcHVibGljIGludCBKSlRTVVBFUlNUQVRFTUVOVCA9IDcxOwotICBwdWJsaWMgaW50IEpKVEJMT0NLID0gNzI7Ci0gIHB1YmxpYyBpbnQgSkpUTEFCRUxFRFNUQVRFTUVOVCA9IDczOwotICBwdWJsaWMgaW50IEpKVElGU1RBVEVNRU5UID0gNzQ7Ci0gIHB1YmxpYyBpbnQgSkpUU1dJVENIU1RBVEVNRU5UID0gNzU7Ci0gIHB1YmxpYyBpbnQgSkpUQ0FTRUVMRU1FTlRTID0gNzY7Ci0gIHB1YmxpYyBpbnQgSkpUQ0FTRUVMRU1FTlQgPSA3NzsKLSAgcHVibGljIGludCBKSlRDQVNFTEFCRUwgPSA3ODsKLSAgcHVibGljIGludCBKSlRET1NUQVRFTUVOVCA9IDc5OwotICBwdWJsaWMgaW50IEpKVFdISUxFU1RBVEVNRU5UID0gODA7Ci0gIHB1YmxpYyBpbnQgSkpURk9SU1RBVEVNRU5UID0gODE7Ci0gIHB1YmxpYyBpbnQgSkpURk9SSU5JVElBTElaRVIgPSA4MjsKLSAgcHVibGljIGludCBKSlRGT1JJTkJJTkRJTkcgPSA4MzsKLSAgcHVibGljIGludCBKSlRXSVRIU1RBVEVNRU5UID0gODQ7Ci0gIHB1YmxpYyBpbnQgSkpUQ09OVElOVUVTVEFURU1FTlQgPSA4NTsKLSAgcHVibGljIGludCBKSlRCUkVBS1NUQVRFTUVOVCA9IDg2OwotICBwdWJsaWMgaW50IEpKVFJFVFVSTlNUQVRFTUVOVCA9IDg3OwotICBwdWJsaWMgaW50IEpKVFRIUk9XU1RBVEVNRU5UID0gODg7Ci0gIHB1YmxpYyBpbnQgSkpUVFJZU1RBVEVNRU5UID0gODk7Ci0gIHB1YmxpYyBpbnQgSkpURElSRUNUSVZFUyA9IDkwOwotICBwdWJsaWMgaW50IEpKVERJUkVDVElWRSA9IDkxOwotICBwdWJsaWMgaW50IEpKVEFOTk9UQVRBQkxFRElSRUNUSVZFID0gOTI7Ci0gIHB1YmxpYyBpbnQgSkpUQVRUUklCVVRFUyA9IDkzOwotICBwdWJsaWMgaW50IEpKVEFUVFJJQlVURSA9IDk0OwotICBwdWJsaWMgaW50IEpKVFVTRURJUkVDVElWRSA9IDk1OwotICBwdWJsaWMgaW50IEpKVElNUE9SVERJUkVDVElWRSA9IDk2OwotICBwdWJsaWMgaW50IEpKVElOQ0xVREVESVJFQ1RJVkUgPSA5NzsKLSAgcHVibGljIGludCBKSlRQUkFHTUEgPSA5ODsKLSAgcHVibGljIGludCBKSlRQUkFHTUFJVEVNUyA9IDk5OwotICBwdWJsaWMgaW50IEpKVFBSQUdNQUlURU0gPSAxMDA7Ci0gIHB1YmxpYyBpbnQgSkpUUFJBR01BRVhQUiA9IDEwMTsKLSAgcHVibGljIGludCBKSlRQUkFHTUFBUkdVTUVOVCA9IDEwMjsKLSAgcHVibGljIGludCBKSlRFWFBPUlRERUZJTklUSU9OID0gMTAzOwotICBwdWJsaWMgaW50IEpKVEVYUE9SVEJJTkRJTkdMSVNUID0gMTA0OwotICBwdWJsaWMgaW50IEpKVEVYUE9SVEJJTkRJTkcgPSAxMDU7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVERUZJTklUSU9OID0gMTA2OwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFREVGSU5JVElPTk5PSU4gPSAxMDc7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVERUZJTklUSU9OS0lORCA9IDEwODsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUJJTkRJTkdMSVNUID0gMTA5OwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFQklORElOR0xJU1ROT0lOID0gMTEwOwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFQklORElORyA9IDExMTsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUJJTkRJTkdOT0lOID0gMTEyOwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFSU5JVElBTElTQVRJT04gPSAxMTM7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTk5PSU4gPSAxMTQ7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVJTklUSUFMSVpFUiA9IDExNTsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUlOSVRJQUxJWkVSTk9JTiA9IDExNjsKLSAgcHVibGljIGludCBKSlRUWVBFRElERU5USUZJRVIgPSAxMTc7Ci0gIHB1YmxpYyBpbnQgSkpUVFlQRURJREVOVElGSUVSTk9JTiA9IDExODsKLSAgcHVibGljIGludCBKSlRTSU1QTEVWQVJJQUJMRURFRklOSVRJT04gPSAxMTk7Ci0gIHB1YmxpYyBpbnQgSkpUVU5UWVBFRFZBUklBQkxFQklORElOR0xJU1QgPSAxMjA7Ci0gIHB1YmxpYyBpbnQgSkpUVU5UWVBFRFZBUklBQkxFQklORElORyA9IDEyMTsKLSAgcHVibGljIGludCBKSlRGVU5DVElPTkRFRklOSVRJT04gPSAxMjI7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05OQU1FID0gMTIzOwotICBwdWJsaWMgaW50IEpKVEZVTkNUSU9OQ09NTU9OID0gMTI0OwotICBwdWJsaWMgaW50IEpKVFBBUkFNRVRFUlMgPSAxMjU7Ci0gIHB1YmxpYyBpbnQgSkpUUEFSQU1FVEVSID0gMTI2OwotICBwdWJsaWMgaW50IEpKVFBBUkFNRVRFUklOSVQgPSAxMjc7Ci0gIHB1YmxpYyBpbnQgSkpUUkVTVFBBUkFNRVRFUlMgPSAxMjg7Ci0gIHB1YmxpYyBpbnQgSkpUUkVTVUxUID0gMTI5OwotICBwdWJsaWMgaW50IEpKVENMQVNTREVGSU5JVElPTiA9IDEzMDsKLSAgcHVibGljIGludCBKSlRJTlRFUkZBQ0VERUZJTklUSU9OID0gMTMxOwotICBwdWJsaWMgaW50IEpKVElOSEVSSVRBTkNFID0gMTMyOwotICBwdWJsaWMgaW50IEpKVE5BTUVTUEFDRURFRklOSVRJT04gPSAxMzM7Ci0gIHB1YmxpYyBpbnQgSkpUUEFDS0FHRURFRklOSVRJT04gPSAxMzQ7Ci0gIHB1YmxpYyBpbnQgSkpUUEFDS0FHRU5BTUUgPSAxMzU7Ci0gIHB1YmxpYyBpbnQgSkpUUEFDS0FHRUlERU5USUZJRVJTID0gMTM2OwotCi0KLSAgcHVibGljIFN0cmluZ1tdIGpqdE5vZGVOYW1lID0gewotICAgICJQcm9ncmFtIiwKLSAgICAiSWRlbnRpZmllciIsCi0gICAgIlNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIiLAotICAgICJFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciIsCi0gICAgIlF1YWxpZmllZElkZW50aWZpZXIiLAotICAgICJQcmltYXJ5RXhwcmVzc2lvbiIsCi0gICAgIlJlc2VydmVkTmFtZXNwYWNlIiwKLSAgICAiRnVuY3Rpb25FeHByZXNzaW9uIiwKLSAgICAiT2JqZWN0TGl0ZXJhbCIsCi0gICAgIkZpZWxkTGlzdCIsCi0gICAgIkxpdGVyYWxGaWVsZCIsCi0gICAgIkZpZWxkTmFtZSIsCi0gICAgIkFycmF5TGl0ZXJhbCIsCi0gICAgIkVsZW1lbnRMaXN0IiwKLSAgICAiTGl0ZXJhbEVsZW1lbnQiLAotICAgICJTdXBlckV4cHJlc3Npb24iLAotICAgICJQb3N0Zml4RXhwcmVzc2lvbiIsCi0gICAgIkF0dHJpYnV0ZUV4cHJlc3Npb24iLAotICAgICJGdWxsUG9zdGZpeEV4cHJlc3Npb24iLAotICAgICJGdWxsTmV3RXhwcmVzc2lvbiIsCi0gICAgIkZ1bmN0aW9uQ29uc3RydWN0b3IiLAotICAgICJGdWxsTmV3U3ViZXhwcmVzc2lvbiIsCi0gICAgIlBvc3RmaXhPcCIsCi0gICAgIlByb3BlcnR5T3JBcmd1bWVudHMiLAotICAgICJQcm9wZXJ0eU9wZXJhdG9yIiwKLSAgICAiQXJndW1lbnRzIiwKLSAgICAiVW5hcnlFeHByZXNzaW9uIiwKLSAgICAiTXVsT3AiLAotICAgICJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLAotICAgICJBZGRPcCIsCi0gICAgIkFkZGl0aXZlRXhwcmVzc2lvbiIsCi0gICAgIlNoaWZ0T3AiLAotICAgICJTaGlmdEV4cHJlc3Npb24iLAotICAgICJSZWxPcCIsCi0gICAgIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwKLSAgICAiUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOIiwKLSAgICAiRXF1YWxPcCIsCi0gICAgIkVxdWFsaXR5RXhwcmVzc2lvbiIsCi0gICAgIkVxdWFsaXR5RXhwcmVzc2lvbk5vSU4iLAotICAgICJCaXR3aXNlQU5ET3AiLAotICAgICJCaXR3aXNlQU5ERXhwcmVzc2lvbiIsCi0gICAgIkJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkJpdHdpc2VYT1JPcCIsCi0gICAgIkJpdHdpc2VYT1JFeHByZXNzaW9uIiwKLSAgICAiQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOIiwKLSAgICAiQml0d2lzZU9ST3AiLAotICAgICJCaXR3aXNlT1JFeHByZXNzaW9uIiwKLSAgICAiQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4iLAotICAgICJMb2dpY2FsQU5ERXhwcmVzc2lvbiIsCi0gICAgIkxvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkxvZ2ljYWxPUkV4cHJlc3Npb24iLAotICAgICJMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiIsCi0gICAgIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsCi0gICAgIkNvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4iLAotICAgICJOb25Bc3NpZ25tZW50RXhwcmVzc2lvbiIsCi0gICAgIk5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkFzc2lnbmVtZW50T3BlcmF0b3IiLAotICAgICJBc3NpZ25tZW50RXhwcmVzc2lvbiIsCi0gICAgIkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkxpc3RFeHByZXNzaW9uIiwKLSAgICAiTGlzdEV4cHJlc3Npb25Ob0lOIiwKLSAgICAiVHlwZUV4cHJlc3Npb24iLAotICAgICJUeXBlRXhwcmVzc2lvbk5vSU4iLAotICAgICJUeXBlRXhwcmVzc2lvbkxpc3QiLAotICAgICJTdGF0ZW1lbnQiLAotICAgICJTdWJzdGF0ZW1lbnQiLAotICAgICJTdWJzdGF0ZW1lbnRzIiwKLSAgICAiU2MiLAotICAgICJFb2xDb21tZW50U2tpcFdzIiwKLSAgICAiRW1wdHlTdGF0ZW1lbnQiLAotICAgICJFeHByZXNzaW9uU3RhdGVtZW50IiwKLSAgICAiU3VwZXJTdGF0ZW1lbnQiLAotICAgICJCbG9jayIsCi0gICAgIkxhYmVsZWRTdGF0ZW1lbnQiLAotICAgICJJZlN0YXRlbWVudCIsCi0gICAgIlN3aXRjaFN0YXRlbWVudCIsCi0gICAgIkNhc2VFbGVtZW50cyIsCi0gICAgIkNhc2VFbGVtZW50IiwKLSAgICAiQ2FzZUxhYmVsIiwKLSAgICAiRG9TdGF0ZW1lbnQiLAotICAgICJXaGlsZVN0YXRlbWVudCIsCi0gICAgIkZvclN0YXRlbWVudCIsCi0gICAgIkZvckluaXRpYWxpemVyIiwKLSAgICAiRm9ySW5CaW5kaW5nIiwKLSAgICAiV2l0aFN0YXRlbWVudCIsCi0gICAgIkNvbnRpbnVlU3RhdGVtZW50IiwKLSAgICAiQnJlYWtTdGF0ZW1lbnQiLAotICAgICJSZXR1cm5TdGF0ZW1lbnQiLAotICAgICJUaHJvd1N0YXRlbWVudCIsCi0gICAgIlRyeVN0YXRlbWVudCIsCi0gICAgIkRpcmVjdGl2ZXMiLAotICAgICJEaXJlY3RpdmUiLAotICAgICJBbm5vdGF0YWJsZURpcmVjdGl2ZSIsCi0gICAgIkF0dHJpYnV0ZXMiLAotICAgICJBdHRyaWJ1dGUiLAotICAgICJVc2VEaXJlY3RpdmUiLAotICAgICJJbXBvcnREaXJlY3RpdmUiLAotICAgICJJbmNsdWRlRGlyZWN0aXZlIiwKLSAgICAiUHJhZ21hIiwKLSAgICAiUHJhZ21hSXRlbXMiLAotICAgICJQcmFnbWFJdGVtIiwKLSAgICAiUHJhZ21hRXhwciIsCi0gICAgIlByYWdtYUFyZ3VtZW50IiwKLSAgICAiRXhwb3J0RGVmaW5pdGlvbiIsCi0gICAgIkV4cG9ydEJpbmRpbmdMaXN0IiwKLSAgICAiRXhwb3J0QmluZGluZyIsCi0gICAgIlZhcmlhYmxlRGVmaW5pdGlvbiIsCi0gICAgIlZhcmlhYmxlRGVmaW5pdGlvbk5vSU4iLAotICAgICJWYXJpYWJsZURlZmluaXRpb25LaW5kIiwKLSAgICAiVmFyaWFibGVCaW5kaW5nTGlzdCIsCi0gICAgIlZhcmlhYmxlQmluZGluZ0xpc3ROb0lOIiwKLSAgICAiVmFyaWFibGVCaW5kaW5nIiwKLSAgICAiVmFyaWFibGVCaW5kaW5nTm9JTiIsCi0gICAgIlZhcmlhYmxlSW5pdGlhbGlzYXRpb24iLAotICAgICJWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiIsCi0gICAgIlZhcmlhYmxlSW5pdGlhbGl6ZXIiLAotICAgICJWYXJpYWJsZUluaXRpYWxpemVyTm9JTiIsCi0gICAgIlR5cGVkSWRlbnRpZmllciIsCi0gICAgIlR5cGVkSWRlbnRpZmllck5vSU4iLAotICAgICJTaW1wbGVWYXJpYWJsZURlZmluaXRpb24iLAotICAgICJVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCIsCi0gICAgIlVudHlwZWRWYXJpYWJsZUJpbmRpbmciLAotICAgICJGdW5jdGlvbkRlZmluaXRpb24iLAotICAgICJGdW5jdGlvbk5hbWUiLAotICAgICJGdW5jdGlvbkNvbW1vbiIsCi0gICAgIlBhcmFtZXRlcnMiLAotICAgICJQYXJhbWV0ZXIiLAotICAgICJQYXJhbWV0ZXJJbml0IiwKLSAgICAiUmVzdFBhcmFtZXRlcnMiLAotICAgICJSZXN1bHQiLAotICAgICJDbGFzc0RlZmluaXRpb24iLAotICAgICJJbnRlcmZhY2VEZWZpbml0aW9uIiwKLSAgICAiSW5oZXJpdGFuY2UiLAotICAgICJOYW1lc3BhY2VEZWZpbml0aW9uIiwKLSAgICAiUGFja2FnZURlZmluaXRpb24iLAotICAgICJQYWNrYWdlTmFtZSIsCi0gICAgIlBhY2thZ2VJZGVudGlmaWVycyIsCi0gIH07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFZpc2l0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjJkMDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIC5cSlNQYXJzZXIyMFZpc2l0b3IuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQYXJzZXIyMFZpc2l0b3IKLXsKLSAgcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9ncmFtIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUXVhbGlmaWVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJpbWFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlc2VydmVkTmFtZXNwYWNlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE9iamVjdExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZpZWxkTGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGl0ZXJhbEZpZWxkIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGaWVsZE5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFycmF5TGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURWxlbWVudExpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWxFbGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdXBlckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBvc3RmaXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBdHRyaWJ1dGVFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bGxOZXdFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkNvbnN0cnVjdG9yIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUG9zdGZpeE9wIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9wZXJ0eU9yQXJndW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9wZXJ0eU9wZXJhdG9yIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBcmd1bWVudHMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVuYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTXVsT3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkT3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZGl0aXZlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2hpZnRPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2hpZnRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ET3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZVhPUkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZU9ST3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsT1JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBc3NpZ25lbWVudE9wZXJhdG9yIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXN0RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGlzdEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZUV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbkxpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3Vic3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdWJzdGF0ZW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTYyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURW9sQ29tbWVudFNraXBXcyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURW1wdHlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN1cGVyU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCbG9jayBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGFiZWxlZFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSWZTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN3aXRjaFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUVsZW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDYXNlRWxlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUxhYmVsIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1REb1N0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUV2hpbGVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvclN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURm9ySW5pdGlhbGl6ZXIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvckluQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUV2l0aFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29udGludWVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJyZWFrU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXR1cm5TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFRocm93U3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUcnlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVERpcmVjdGl2ZXMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVERpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEF0dHJpYnV0ZXMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEF0dHJpYnV0ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVXNlRGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJbXBvcnREaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEluY2x1ZGVEaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJhZ21hSXRlbXMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUl0ZW0gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUV4cHIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUFyZ3VtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHBvcnREZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHBvcnRCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwb3J0QmluZGluZyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdMaXN0IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdOb0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXplciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZWRJZGVudGlmaWVyTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25EZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbk5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uQ29tbW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXJzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhcmFtZXRlckluaXQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlc3RQYXJhbWV0ZXJzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXN1bHQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENsYXNzRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW50ZXJmYWNlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW5oZXJpdGFuY2Ugbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE5hbWVzcGFjZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhY2thZ2VEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYWNrYWdlTmFtZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFja2FnZUlkZW50aWZpZXJzIG5vZGUsIE9iamVjdCBkYXRhKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ob2RlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2VhMmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBOb2RlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKiBBbGwgQVNUIG5vZGVzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgSXQgcHJvdmlkZXMgYmFzaWMKLSAgIG1hY2hpbmVyeSBmb3IgY29uc3RydWN0aW5nIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHJlbGF0aW9uc2hpcHMKLSAgIGJldHdlZW4gbm9kZXMuICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZQotewotCi0gIC8qKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIG5vZGUgaGFzIGJlZW4gbWFkZSB0aGUgY3VycmVudAotICAgIG5vZGUuICBJdCBpbmRpY2F0ZXMgdGhhdCBjaGlsZCBub2RlcyBjYW4gbm93IGJlIGFkZGVkIHRvIGl0LiAqLwotICBwdWJsaWMgdm9pZCBqanRPcGVuKCk7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGNoaWxkIG5vZGVzIGhhdmUgYmVlbgotICAgIGFkZGVkLiAqLwotICBwdWJsaWMgdm9pZCBqanRDbG9zZSgpOwotCi0gIC8qKiBUaGlzIHBhaXIgb2YgbWV0aG9kcyBhcmUgdXNlZCB0byBpbmZvcm0gdGhlIG5vZGUgb2YgaXRzCi0gICAgcGFyZW50LiAqLwotICBwdWJsaWMgdm9pZCBqanRTZXRQYXJlbnQoTm9kZSBuKTsKLQotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKTsKLQotICAvKiogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG5vZGUgdG8gYWRkIGl0cyBhcmd1bWVudCB0byB0aGUgbm9kZSdzCi0gICAgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgY2hpbGQgbm9kZS4gIFRoZSBjaGlsZHJlbiBhcmUgbnVtYmVyZWQKLSAgICAgZnJvbSB6ZXJvLCBsZWZ0IHRvIHJpZ2h0LiAqLwotICBwdWJsaWMgTm9kZSBqanRHZXRDaGlsZChpbnQgaSk7Ci0KLSAgLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoZSBub2RlIGhhcy4gKi8KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpOwotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlOGQ1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCi0gKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQotICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAotICogcGFyc2VyLgotICoKLSAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCi0gKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgLyoqCi0gICAqIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKLSAgICogdGhpcyBvYmplY3QgYW5kIHRoZXJlYnkgYWZmZWN0cyB0aGUgc2VtYW50aWNzIG9mIHRoZQotICAgKiAiZ2V0TWVzc2FnZSIgbWV0aG9kIChzZWUgYmVsb3cpLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lhbENvbnN0cnVjdG9yOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKLSAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCi0gICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOwotCi0gIC8qKgotICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5Ci0gICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKLSAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgotICAgKi8KLSAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKLQotICAvKioKLSAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKLSAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCi0gICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIG1ldGhvZCAiZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiIKLSAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZ2VuZXJhdGVzCi0gICAqIGEgbmV3IG9iamVjdCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgZmllbGRzICJjdXJyZW50VG9rZW4iLAotICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LiAgVGhlIGJvb2xlYW4KLSAgICogZmxhZyAic3BlY2lhbENvbnN0cnVjdG9yIiBpcyBhbHNvIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQKLSAgICogdGhpcyBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZwotICAgKiB0byBmb3JjZSB0aGUgInRvU3RyaW5nIiBtZXRob2Qgb2YgcGFyZW50IGNsYXNzICJUaHJvd2FibGUiIHRvCi0gICAqIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtOgotICAgKiAgICAgUGFyc2VFeGNlcHRpb246IDxyZXN1bHQgb2YgZ2V0TWVzc2FnZT4KLSAgICovCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiAgICBjdXJyZW50VG9rZW5WYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdICBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbCkKLSAgewotICAgIHN1cGVyKCIiKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSB0cnVlOwotICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKLSAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKLSAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCi0gICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKLSAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKLSAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCi0gICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKLSAgICogdGhlc2UgY29uc3RydWN0b3JzLgotICAgKi8KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgotICAgKiBjcmVhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcnMuICBPdGhlcndpc2UsIGl0IHVzZXMKLSAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCi0gICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCi0gICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KLSAgICogZnJvbSB0aGUgcGFyc2VyKSwgdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBwcmludGluZwotICAgKiBvZiB0aGUgZmluYWwgc3RhY2sgdHJhY2UsIGFuZCBoZW5jZSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCi0gICAqIGdldHMgZGlzcGxheWVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotCi0gICAgaWYgKCFzcGVjaWFsQ29uc3RydWN0b3IpCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiIjsKLSAgICBpbnQgICAgbWF4U2l6ZSA9IDA7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspCi0gICAgewotCi0gICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKQotICAgICAgewotICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgZXhwZWN0ZWQgKz0gdG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSArICIgIjsKLSAgICAgIH0KLQotICAgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGggLSAxXSAhPSAwKQotICAgICAgewotICAgICAgICBleHBlY3RlZCArPSAiLi4uIjsKLSAgICAgIH0KLQotICAgICAgZXhwZWN0ZWQgKz0gZW9sICsgIiAgICAiOwotICAgIH0KLQotICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOwotICAgIFRva2VuICB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKQotICAgIHsKLQotICAgICAgaWYgKGkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsICs9ICIgIjsKLSAgICAgIH0KLQotICAgICAgaWYgKHRvay5raW5kID09IDApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCArPSB0b2tlbkltYWdlWzBdOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKLSAgICAgIHRvayA9IHRvay5uZXh0OwotICAgIH0KLQotICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKwotICAgICAgY3VycmVudFRva2VuLm5leHQuYmVnaW5Db2x1bW47Ci0gICAgcmV0dmFsICs9ICIuIiArIGVvbDsKLQotICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOwotICAgIH0KLQotICAgIHJldHZhbCArPSBleHBlY3RlZDsKLQotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgotICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKLSAgICogc3RyaW5nIGxpdGVyYWwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGNoYXIgICAgICAgICBjaDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgewotCi0gICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICB7Ci0KLSAgICAgIGNhc2UgMDoKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xiJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1x0JzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xmJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xyJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1wiJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcJyc6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXFwnOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0KLSAgICAgICAgaWYgKCgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjApIHx8IChjaCA+IDB4N2UpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlQ2hhclN0cmVhbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI3ZTAxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1NpbXBsZUNoYXJTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZUNoYXJTdHJlYW0uamF2YSBWZXJzaW9uIDQuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBDaGFyU3RyZWFtLCB3aGVyZSB0aGUgc3RyZWFtIGlzIGFzc3VtZWQgdG8KLSAqIGNvbnRhaW4gb25seSBBU0NJSSBjaGFyYWN0ZXJzICh3aXRob3V0IHVuaWNvZGUgcHJvY2Vzc2luZykuCi0gKi8KLQotcHVibGljIGNsYXNzIFNpbXBsZUNoYXJTdHJlYW0KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0YXRpY0ZsYWcgPSBmYWxzZTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGU7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkJlZ2luOwotICBwdWJsaWMgaW50ICAgICAgICAgICAgICAgICAgYnVmcG9zID0gLTE7Ci0gIHByb3RlY3RlZCBpbnRbXSAgICAgICAgICAgICBidWZsaW5lOwotICBwcm90ZWN0ZWQgaW50W10gICAgICAgICAgICAgYnVmY29sdW1uOwotCi0gIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKLSAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOwotCi0gIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOwotICBwcm90ZWN0ZWQgaW50ICAgIG1heE5leHRDaGFySW5kID0gMDsKLSAgcHJvdGVjdGVkIGludCAgICBpbkJ1ZiA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgICAgdGFiU2l6ZSA9IDg7Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOwotICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKChlbmNvZGluZyA9PSBudWxsKSA/IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksCi0gICAgICAgICBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCBidWZmZXJzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sCi0gICAgICAgICBidWZmZXJzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4pCi0gICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgdGhpcyhkc3RyZWFtLCBlbmNvZGluZywgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZykKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKGRzdHJlYW0sIGVuY29kaW5nLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRUYWJTaXplKGludCBpKQotICB7Ci0gICAgdGFiU2l6ZSA9IGk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldFRhYlNpemUoaW50IGkpCi0gIHsKLSAgICByZXR1cm4gdGFiU2l6ZTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgRXhwYW5kQnVmZihib29sZWFuIHdyYXBBcm91bmQpCi0gIHsKLSAgICBjaGFyW10gbmV3YnVmZmVyID0gbmV3IGNoYXJbYnVmc2l6ZSArIDIwNDhdOwotICAgIGludFtdICBuZXdidWZsaW5lID0gbmV3IGludFtidWZzaXplICsgMjA0OF07Ci0gICAgaW50W10gIG5ld2J1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotCi0gICAgdHJ5Ci0gICAgewotCi0gICAgICBpZiAod3JhcEFyb3VuZCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBuZXdidWZmZXIsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCAwLCBuZXdidWZjb2x1bW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnBvcyk7Ci0gICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgKz0gKGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgLT0gdG9rZW5CZWdpbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IodC5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIGJ1ZnNpemUgKz0gMjA0ODsKLSAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgIHRva2VuQmVnaW4gPSAwOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgRmlsbEJ1ZmYoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBpZiAobWF4TmV4dENoYXJJbmQgPT0gYXZhaWxhYmxlKQotICAgIHsKLQotICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQotICAgICAgewotCi0gICAgICAgIGlmICh0b2tlbkJlZ2luID4gMjA0OCkKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRva2VuQmVnaW4gPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEV4cGFuZEJ1ZmYoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdmFpbGFibGUgPiB0b2tlbkJlZ2luKQotICAgICAgewotICAgICAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKHRva2VuQmVnaW4gLSBhdmFpbGFibGUpIDwgMjA0OCkKLSAgICAgIHsKLSAgICAgICAgRXhwYW5kQnVmZih0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgaTsKLQotICAgIHRyeQotICAgIHsKLQotICAgICAgaWYgKChpID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG1heE5leHRDaGFySW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAtLWJ1ZnBvczsKLSAgICAgIGJhY2t1cCgwKTsKLQotICAgICAgaWYgKHRva2VuQmVnaW4gPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0gICAgICB9Ci0KLSAgICAgIHRocm93IGU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICB0b2tlbkJlZ2luID0gLTE7Ci0KLSAgICBjaGFyIGMgPSByZWFkQ2hhcigpOwotICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0KLSAgICByZXR1cm4gYzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIFVwZGF0ZUxpbmVDb2x1bW4oY2hhciBjKQotICB7Ci0gICAgY29sdW1uKys7Ci0KLSAgICBpZiAocHJldkNoYXJJc0xGKQotICAgIHsKLSAgICAgIHByZXZDaGFySXNMRiA9IGZhbHNlOwotICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByZXZDaGFySXNDUikKLSAgICB7Ci0gICAgICBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLQotICAgICAgaWYgKGMgPT0gJ1xuJykKLSAgICAgIHsKLSAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChjKQotICAgIHsKLQotICAgIGNhc2UgJ1xyJzoKLSAgICB7Ci0gICAgICBwcmV2Q2hhcklzQ1IgPSB0cnVlOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlICdcbic6Ci0gICAgewotICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSAnXHQnOgotICAgIHsKLSAgICAgIGNvbHVtbi0tOwotICAgICAgY29sdW1uICs9ICh0YWJTaXplIC0gKGNvbHVtbiAlIHRhYlNpemUpKTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgfQotCi0gICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKLSAgICBidWZjb2x1bW5bYnVmcG9zXSA9IGNvbHVtbjsKLSAgfQotCi0gIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotCi0gICAgaWYgKGluQnVmID4gMCkKLSAgICB7Ci0gICAgICAtLWluQnVmOwotCi0gICAgICBpZiAoKytidWZwb3MgPT0gYnVmc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgYnVmcG9zID0gMDsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGJ1ZmZlcltidWZwb3NdOwotICAgIH0KLQotICAgIGlmICgrK2J1ZnBvcyA+PSBtYXhOZXh0Q2hhckluZCkKLSAgICB7Ci0gICAgICBGaWxsQnVmZigpOwotICAgIH0KLQotICAgIGNoYXIgYyA9IGJ1ZmZlcltidWZwb3NdOwotCi0gICAgVXBkYXRlTGluZUNvbHVtbihjKTsKLQotICAgIHJldHVybiAoYyk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogQHNlZSAjZ2V0RW5kQ29sdW1uCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgewotICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBAc2VlICNnZXRFbmRMaW5lCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpCi0gIHsKLSAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRDb2x1bW4oKQotICB7Ci0gICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRMaW5lKCkKLSAgewotICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luQ29sdW1uKCkKLSAgewotICAgIHJldHVybiBidWZjb2x1bW5bdG9rZW5CZWdpbl07Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luTGluZSgpCi0gIHsKLSAgICByZXR1cm4gYnVmbGluZVt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJhY2t1cChpbnQgYW1vdW50KQotICB7Ci0KLSAgICBpbkJ1ZiArPSBhbW91bnQ7Ci0KLSAgICBpZiAoKGJ1ZnBvcyAtPSBhbW91bnQpIDwgMCkKLSAgICB7Ci0gICAgICBidWZwb3MgKz0gYnVmc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICBpbnB1dFN0cmVhbSA9IGRzdHJlYW07Ci0gICAgbGluZSA9IHN0YXJ0bGluZTsKLSAgICBjb2x1bW4gPSBzdGFydGNvbHVtbiAtIDE7Ci0KLSAgICBpZiAoKGJ1ZmZlciA9PSBudWxsKSB8fCAoYnVmZmVyc2l6ZSAhPSBidWZmZXIubGVuZ3RoKSkKLSAgICB7Ci0gICAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKLSAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIH0KLQotICAgIHByZXZDaGFySXNMRiA9IHByZXZDaGFySXNDUiA9IGZhbHNlOwotICAgIHRva2VuQmVnaW4gPSBpbkJ1ZiA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICBidWZwb3MgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGxpbmUsIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIFJlSW5pdCgoZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgPyBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKQotICAgICAgICAgICA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwgc3RhcnRsaW5lLAotICAgICAgICAgICBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwKLSAgICAgICAgICAgYnVmZmVyc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpCi0gICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uKQotICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICBSZUluaXQoZHN0cmVhbSwgZW5jb2RpbmcsIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgR2V0SW1hZ2UoKQotICB7Ci0KLSAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZwb3MgLSB0b2tlbkJlZ2luICsgMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCi0gICAgICAgIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZwb3MgKyAxKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQotICB7Ci0gICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07Ci0KLSAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKLSAgICB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmcG9zIC0gbGVuICsgMSwgcmV0LCAwLCBsZW4pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnNpemUgLSAobGVuIC0gYnVmcG9zIC0gMSksIHJldCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gYnVmcG9zIC0gMSk7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgcmV0LCBsZW4gLSBidWZwb3MgLSAxLCBidWZwb3MgKyAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgRG9uZSgpCi0gIHsKLSAgICBidWZmZXIgPSBudWxsOwotICAgIGJ1ZmxpbmUgPSBudWxsOwotICAgIGJ1ZmNvbHVtbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCi0gIHsKLSAgICBpbnQgc3RhcnQgPSB0b2tlbkJlZ2luOwotICAgIGludCBsZW47Ci0KLSAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgewotICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxlbiA9IGJ1ZnNpemUgLSB0b2tlbkJlZ2luICsgYnVmcG9zICsgMSArIGluQnVmOwotICAgIH0KLQotICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOwotICAgIGludCBuZXh0Q29sRGlmZiA9IDAsIGNvbHVtbkRpZmYgPSAwOwotCi0gICAgd2hpbGUgKChpIDwgbGVuKSAmJgotICAgICAgICAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSA9PSBidWZsaW5lW2sgPSArK3N0YXJ0ICUgYnVmc2l6ZV0pKQotICAgIHsKLSAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOwotICAgICAgbmV4dENvbERpZmYgPSBjb2x1bW5EaWZmICsgYnVmY29sdW1uW2tdIC0gYnVmY29sdW1uW2pdOwotICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLSAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgICBpZiAoaSA8IGxlbikKLSAgICB7Ci0gICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLQotICAgICAgd2hpbGUgKGkrKyA8IGxlbikKLSAgICAgIHsKLQotICAgICAgICBpZiAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSAhPSBidWZsaW5lWysrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgICAgewotICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBsaW5lID0gYnVmbGluZVtqXTsKLSAgICBjb2x1bW4gPSBidWZjb2x1bW5bal07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlTm9kZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWNlZTkzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1NpbXBsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZU5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVOb2RlIGltcGxlbWVudHMgTm9kZQotewotICBwcm90ZWN0ZWQgTm9kZSAgICAgICBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBOb2RlW10gICAgIGNoaWxkcmVuOwotICBwcm90ZWN0ZWQgaW50ICAgICAgICBpZDsKLSAgcHJvdGVjdGVkIEpTUGFyc2VyMjAgcGFyc2VyOwotCi0gIHByb3RlY3RlZCBUb2tlbiAgICAgIGZpcnN0OwotICBwcm90ZWN0ZWQgVG9rZW4gICAgICBsYXN0OwotCi0gIHB1YmxpYyBTaW1wbGVOb2RlKGludCBpKQotICB7Ci0gICAgaWQgPSBpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZU5vZGUoSlNQYXJzZXIyMCBwLCBpbnQgaSkKLSAgewotICAgIHRoaXMoaSk7Ci0gICAgcGFyc2VyID0gcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKQotICB7Ci0gICAgZmlyc3QgPSBwYXJzZXIuZ2V0VG9rZW4oMSk7IC8vIG5ldwotICB9Ci0KLSAgcHVibGljIHZvaWQgamp0Q2xvc2UoKQotICB7Ci0gICAgbGFzdCA9IHBhcnNlci5nZXRUb2tlbigwKTsgLy8gbmV3Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4gZ2V0Rmlyc3RUb2tlbigpIHsgcmV0dXJuIGZpcnN0OyB9IC8vIG5ldwotICBwdWJsaWMgVG9rZW4gZ2V0TGFzdFRva2VuKCkgeyByZXR1cm4gbGFzdDsgfSAgIC8vIG5ldwotCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pCi0gIHsKLSAgICBwYXJlbnQgPSBuOwotICB9Ci0KLSAgcHVibGljIE5vZGUgamp0R2V0UGFyZW50KCkKLSAgewotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBqanRBZGRDaGlsZChOb2RlIG4sIGludCBpKQotICB7Ci0KLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjaGlsZHJlbiA9IG5ldyBOb2RlW2kgKyAxXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaSA+PSBjaGlsZHJlbi5sZW5ndGgpCi0gICAgewotICAgICAgTm9kZVtdIGMgPSBuZXcgTm9kZVtpICsgMV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCAwLCBjLCAwLCBjaGlsZHJlbi5sZW5ndGgpOwotICAgICAgY2hpbGRyZW4gPSBjOwotICAgIH0KLQotICAgIGNoaWxkcmVuW2ldID0gbjsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGpqdEdldENoaWxkKGludCBpKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuW2ldOwotICB9Ci0KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gKGNoaWxkcmVuID09IG51bGwpID8gMCA6IGNoaWxkcmVuLmxlbmd0aDsKLSAgfQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3QgY2hpbGRyZW5BY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLQotICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKQotICAgIHsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uamp0QWNjZXB0KHZpc2l0b3IsIGRhdGEpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgLyogWW91IGNhbiBvdmVycmlkZSB0aGVzZSB0d28gbWV0aG9kcyBpbiBzdWJjbGFzc2VzIG9mIFNpbXBsZU5vZGUgdG8KLSAgICAgY3VzdG9taXplIHRoZSB3YXkgdGhlIG5vZGUgYXBwZWFycyB3aGVuIHRoZSB0cmVlIGlzIGR1bXBlZC4gIElmCi0gICAgIHlvdXIgb3V0cHV0IHVzZXMgbW9yZSB0aGFuIG9uZSBsaW5lIHlvdSBzaG91bGQgb3ZlcnJpZGUKLSAgICAgdG9TdHJpbmcoU3RyaW5nKSwgb3RoZXJ3aXNlIG92ZXJyaWRpbmcgdG9TdHJpbmcoKSBpcyBwcm9iYWJseSBhbGwKLSAgICAgeW91IG5lZWQgdG8gZG8uICovCi0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamp0Tm9kZU5hbWVbaWRdOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgcmV0dXJuIHByZWZpeCArIHRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3Ugd2FudCB0byBjdXN0b21pemUgaG93IHRoZSBub2RlIGR1bXBzCi0gICAgIG91dCBpdHMgY2hpbGRyZW4uICovCi0KLSAgcHVibGljIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHRvU3RyaW5nKHByZWZpeCkpOwotCi0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgewotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQotICAgICAgewotICAgICAgICBTaW1wbGVOb2RlIG4gPSAoU2ltcGxlTm9kZSkgY2hpbGRyZW5baV07Ci0KLSAgICAgICAgaWYgKG4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG4uZHVtcChwcmVmaXggKyAiICIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ub2tlbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliMzg4Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW4uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgotICovCi0KLXB1YmxpYyBjbGFzcyBUb2tlbgotewotICBwdWJsaWMgYm9vbGVhbiBoYXNQcmludGVkID0gZmFsc2U7Ci0gIC8qKgotICAgKiBBbiBpbnRlZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoaXMgdG9rZW4uICBUaGlzIG51bWJlcmluZwotICAgKiBzeXN0ZW0gaXMgZGV0ZXJtaW5lZCBieSBKYXZhQ0NQYXJzZXIsIGFuZCBhIHRhYmxlIG9mIHRoZXNlIG51bWJlcnMgaXMKLSAgICogc3RvcmVkIGluIHRoZSBmaWxlIC4uLkNvbnN0YW50cy5qYXZhLgotICAgKi8KLSAgcHVibGljIGludCBraW5kOwotCi0gIC8qKgotICAgKiBiZWdpbkxpbmUgYW5kIGJlZ2luQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoaXMgdG9rZW47IGVuZExpbmUgYW5kIGVuZENvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgaW50IGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbjsKLQotICAvKioKLSAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGltYWdlOwotCi0gIC8qKgotICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKLSAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQotICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCi0gICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgotICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICAgKiB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIFRva2VuIG5leHQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCi0gICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCi0gICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgotICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKLSAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0Ci0gICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KLSAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KLSAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKLSAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKLSAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgotICAgKi8KLSAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW1hZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFRva2VuIG9iamVjdCwgYnkgZGVmYXVsdC4gSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdQotICAgKiBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLgotICAgKiBTaW1wbHkgYWRkIHRoZSBjYXNlcyB0byB0aGUgc3dpdGNoIGZvciBhbGwgdGhvc2Ugc3BlY2lhbCBjYXNlcy4KLSAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc3ViY2xhc3Mgb2YgVG9rZW4gY2FsbGVkIElEVG9rZW4gdGhhdAotICAgKiB5b3Ugd2FudCB0byBjcmVhdGUgaWYgb2ZLaW5kIGlzIElELCBzaW1scHkgYWRkIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbigpOwotICAgKgotICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgotICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIGl0IGluIHlvdXIgbGV4aWNhbCBhY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kKQotICB7Ci0KLSAgICBzd2l0Y2ggKG9mS2luZCkKLSAgICB7Ci0KLSAgICBkZWZhdWx0OgotICAgIHsKLSAgICAgIHJldHVybiBuZXcgVG9rZW4oKTsKLSAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0MzI5NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ub2tlbk1nckVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIFRva2VuTWdyRXJyb3IgZXh0ZW5kcyBFcnJvcgotewotICAvKgotICAgKiBPcmRpbmFscyBmb3IgdmFyaW91cyByZWFzb25zIHdoeSBhbiBFcnJvciBvZiB0aGlzIHR5cGUgY2FuIGJlIHRocm93bi4KLSAgICovCi0KLSAgLyoqCi0gICAqIExleGljYWwgZXJyb3Igb2NjdXJlZC4KLSAgICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTEVYSUNBTF9FUlJPUiA9IDA7Ci0KLSAgLyoqCi0gICAqIEFuIGF0dGVtcHQgd2FzcyBtYWRlIHRvIGNyZWF0ZSBhIHNlY29uZCBpbnN0YW5jZSBvZiBhIHN0YXRpYyB0b2tlbiBtYW5hZ2VyLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTEVYRVJfRVJST1IgPSAxOwotCi0gIC8qKgotICAgKiBUcmllZCB0byBjaGFuZ2UgdG8gYW4gaW52YWxpZCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0xFWElDQUxfU1RBVEUgPSAyOwotCi0gIC8qKgotICAgKiBEZXRlY3RlZCAoYW5kIGJhaWxlZCBvdXQgb2YpIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIHRva2VuIG1hbmFnZXIuCi0gICAqLwotICBzdGF0aWMgZmluYWwgaW50IExPT1BfREVURUNURUQgPSAzOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEl0IHdpbGwgaGF2ZQotICAgKiBvbmUgb2YgdGhlIGFib3ZlIDQgdmFsdWVzLgotICAgKi8KLSAgaW50IGVycm9yQ29kZTsKLQotICAvKgotICAgKiBDb25zdHJ1Y3RvcnMgb2YgdmFyaW91cyBmbGF2b3JzIGZvbGxvdy4KLSAgICovCi0KLSAgcHVibGljIFRva2VuTWdyRXJyb3IoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IHJlYXNvbikKLSAgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbk1nckVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBjaGFyIGN1ckNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24pCi0gIHsKLSAgICB0aGlzKExleGljYWxFcnJvcihFT0ZTZWVuLCBsZXhTdGF0ZSwgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgZXJyb3JBZnRlciwKLSAgICAgICAgICAgICAgICAgICAgICBjdXJDaGFyKSwgcmVhc29uKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzcGFjZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKLSAgICogZXF1aXZhbGVudHMgaW4gdGhlIGdpdmVuIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBjaGFyICAgICAgICAgY2g7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgIHsKLQotICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQotICAgICAgewotCi0gICAgICBjYXNlIDA6Ci0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcYic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcdCc6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcbic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcZic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdccic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcIic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXCcnOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xcJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgewotCi0gICAgICAgIGlmICgoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwKSB8fCAoY2ggPiAweDdlKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOwotICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBkZXRhaWxlZCBtZXNzYWdlIGZvciB0aGUgRXJyb3Igd2hlbiBpdCBpcyB0aHJvd24gYnkgdGhlCi0gICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgotICAgKiBQYXJhbWV0ZXJzIDoKLSAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNsIGVycm9yCi0gICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICogICAgZXJyb3JMaW5lICAgOiBsaW5lIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgKiAgICBjdXJjaGFyICAgICA6IHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVyCi0gICAqIE5vdGU6IFlvdSBjYW4gY3VzdG9taXplIHRoZSBsZXhpY2FsIGVycm9yIG1lc3NhZ2UgYnkgbW9kaWZ5aW5nIHRoaXMgbWV0aG9kLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgTGV4aWNhbEVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhcikKLSAgewotICAgIHJldHVybiAoIkxleGljYWwgZXJyb3IgYXQgbGluZSAiICsgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKyBlcnJvckNvbHVtbiArCi0gICAgICAgICIuICBFbmNvdW50ZXJlZDogIiArCi0gICAgICAgIChFT0ZTZWVuCi0gICAgICAgICAgPyAiPEVPRj4gIgotICAgICAgICAgIDogKCgiXCIiICsgYWRkRXNjYXBlcyhTdHJpbmcudmFsdWVPZihjdXJDaGFyKSkgKyAiXCIiKSArICIgKCIgKwotICAgICAgICAgICAgKGludCkgY3VyQ2hhciArICIpLCAiKSkgKyAiYWZ0ZXIgOiBcIiIgKyBhZGRFc2NhcGVzKGVycm9yQWZ0ZXIpICsKLSAgICAgICAgIlwiIik7Ci0gIH0KLQotICAvKioKLSAgICogWW91IGNhbiBhbHNvIG1vZGlmeSB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgeW91ciBlcnJvciBtZXNzYWdlcy4KLSAgICogRm9yIGV4YW1wbGUsIGNhc2VzIGxpa2UgTE9PUF9ERVRFQ1RFRCBhbmQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFIGFyZSBub3QKLSAgICogb2YgZW5kLXVzZXJzIGNvbmNlcm4sIHNvIHlvdSBjYW4gcmV0dXJuIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgICJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCAuLi4uICIKLSAgICoKLSAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL2pzMi4wLmpqIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGQyNDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamoKKysrIC9kZXYvbnVsbApAQCAtMSw0ODM5ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQotLypAYmdlbihqanRyZWUpIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gLlxqczIuMC5qaiAqLw0KLS8qQGVnZW4qL29wdGlvbnMgew0KLSAgICBTVEFUSUM9ZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBERUJVR19UT0tFTl9NQU5BR0VSPWZhbHNlOw0KLSAgICBERUJVR19QQVJTRVI9ZmFsc2U7DQotfQ0KLQ0KLVBBUlNFUl9CRUdJTihKU1BhcnNlcjIwKQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1wdWJsaWMgY2xhc3MgSlNQYXJzZXIyMC8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BhcnNlcjIwVHJlZUNvbnN0YW50cy8qQGVnZW4qLyANCi17LypAYmdlbihqanRyZWUpKi8NCi0gIHByb3RlY3RlZCBKSlRKU1BhcnNlcjIwU3RhdGUgamp0cmVlID0gbmV3IEpKVEpTUGFyc2VyMjBTdGF0ZSgpOw0KLQ0KLS8qQGVnZW4qLw0KLSAgICAvLw0KLSAgICAvLyBUaGlzIGlzIHRoZSByb290IG5vZGUgZm9yIHRoZSBwYXJzZSB0cmVlIChyb290IERPTSBub2RlLCB0cmVlIG9mIFNpbXBsZU5vZGUocykpDQotICAgIC8vDQotICAgIHByb3RlY3RlZCBBU1RQcm9ncmFtIF9qanRSb290Ow0KLSAgICANCi0gICAgcHVibGljIEFTVFByb2dyYW0gZ2V0Um9vdE5vZGUoKQ0KLSAgICB7DQotICAgIAlyZXR1cm4gX2pqdFJvb3Q7DQotICAgIH0NCi0gICAgDQotfQ0KLQ0KLVBBUlNFUl9FTkQoSlNQYXJzZXIyMCkNCi0NCi0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIExFWElDQUwgUlVMRVMgU2VjdGlvbg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotVE9LRU5fTUdSX0RFQ0xTIDoNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlZ1ZhbGlkID0gdHJ1ZTsNCi0gICAgcHVibGljIHZvaWQgc2V0UmVnSW52YWxpZCgpDQotICAgIHsNCi0gICAgICAgIGlzUmVnVmFsaWQgPSBmYWxzZTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdWYWxpZCgpDQotICAgIHsNCi0gICAgICAgIGlzUmVnVmFsaWQgPSB0cnVlOw0KLSAgICB9DQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gV0hJVEUgU1BBQ0UgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1TUEVDSUFMX1RPS0VOIDoNCi17DQotICAgICAgICA8RU9MOiAgIChbIlxuIiwiXHIiXSkrID4NCi0gICAgfCAgIDxXUzogICAgKFsiICIsIlx0Il0pKyA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQ09NTUVOVFMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1NT1JFIDoNCi17DQotICAgICAgICAiLy8iIDogSU5fU0lOR0xFX0xJTkVfQ09NTUVOVA0KLSAgICB8ICAgIi8qIiA6IElOX01VTFRJX0xJTkVfQ09NTUVOVA0KLX0NCi0NCi08SU5fU0lOR0xFX0xJTkVfQ09NTUVOVD4NCi1TUEVDSUFMX1RPS0VOIDoNCi17DQotICAgICAgICA8IFNJTkdMRV9MSU5FX0NPTU1FTlQ6ICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHIifCJcclxuIik/ID4gIDogREVGQVVMVA0KLX0NCi0NCi08SU5fTVVMVElfTElORV9DT01NRU5UPg0KLVNQRUNJQUxfVE9LRU4gOg0KLXsNCi0gICAgICAgIDxNVUxUSV9MSU5FX0NPTU1FTlQ6ICIqLyIgPiA6IERFRkFVTFQNCi19DQotDQotPElOX1NJTkdMRV9MSU5FX0NPTU1FTlQsIElOX01VTFRJX0xJTkVfQ09NTUVOVD4NCi1NT1JFIDoNCi17DQotICAgICAgICA8IH5bXSA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUkVTRVJWRUQgV09SRFMgQU5EIExJVEVSQUxTDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBBUzogICAgICAgICAgICJhcyIgICAgICAgICA+DQotICAgIHwgICA8IEJSRUFLOiAgICAgICAgImJyZWFrIiAgICAgID4NCi0gICAgfCAgIDwgQ0FTRTogICAgICAgICAiY2FzZSIgICAgICAgPg0KLSAgICB8ICAgPCBDQVRDSDogICAgICAgICJjYXRjaCIgICAgICA+DQotICAgIHwgICA8IENMQVNTOiAgICAgICAgImNsYXNzIiAgICAgID4NCi0gICAgfCAgIDwgQ09OU1Q6ICAgICAgICAiY29uc3QiICAgICAgPg0KLSAgICB8ICAgPCBDT05USU5VRTogICAgICJjb250aW51ZSIgICA+DQotICAgIHwgICA8IF9ERUZBVUxUOiAgICAgImRlZmF1bHQiICAgID4NCi0gICAgfCAgIDwgREVMRVRFOiAgICAgICAiZGVsZXRlIiAgICAgPg0KLSAgICB8ICAgPCBETzogICAgICAgICAgICJkbyIgICAgICAgICA+DQotICAgIHwgICA8IEVMU0U6ICAgICAgICAgImVsc2UiICAgICAgID4NCi0gICAgfCAgIDwgRVhURU5EUzogICAgICAiZXh0ZW5kcyIgICAgPg0KLSAgICB8ICAgPCBGQUxTRTogICAgICAgICJmYWxzZSIgICAgICA+ICAgDQotICAgIHwgICA8IEZJTkFMTFk6ICAgICAgImZpbmFsbHkiICAgID4NCi0gICAgfCAgIDwgRk9SOiAgICAgICAgICAiZm9yIiAgICAgICAgPg0KLSAgICB8ICAgPCBGVU5DVElPTjogICAgICJmdW5jdGlvbiIgICA+DQotICAgIHwgICA8IEZVTkNUSU9OXzogICAgIkZ1bmN0aW9uIiAgID4NCi0gICAgfCAgIDwgR0VUOiAgICAgICAgICAiZ2V0IiAgICAgICAgPg0KLSAgICB8ICAgPCBJRjogICAgICAgICAgICJpZiIgICAgICAgICA+DQotICAgIHwgICA8IElOOiAgICAgICAgICAgImluIiAgICAgICAgID4NCi0gICAgfCAgIDwgSU5DTFVERTogICAgICAiaW5jbHVkZSIgICAgPg0KLSAgICB8ICAgPCBJTlNUQU5DRU9GOiAgICJpbnN0YW5jZW9mIiA+DQotICAgIHwgICA8IElTOiAgICAgICAgICAgImlzIiAgICAgICAgID4NCi0gICAgfCAgIDwgTkFNRVNQQUNFOiAgICAibmFtZXNwYWNlIiAgPg0KLSAgICB8ICAgPCBORVc6ICAgICAgICAgICJuZXciICAgICAgICA+DQotICAgIHwgICA8IE5VTEw6ICAgICAgICAgIm51bGwiICAgICAgID4gICAgDQotICAgIHwgICA8IFBBQ0tBR0U6ICAgICAgInBhY2thZ2UiICAgID4gDQotICAgIHwgICA8IFBSSVZBVEU6ICAgICAgInByaXZhdGUiICAgID4NCi0gICAgfCAgIDwgUFVCTElDOiAgICAgICAicHVibGljIiAgICAgPg0KLSAgICB8ICAgPCBSRVRVUk46ICAgICAgICJyZXR1cm4iICAgICA+DQotICAgIHwgICA8IFNFVDogICAgICAgICAgInNldCIgICAgICAgID4NCi0gICAgfCAgIDwgU1VQRVI6ICAgICAgICAic3VwZXIiICAgICAgPg0KLSAgICB8ICAgPCBTV0lUQ0g6ICAgICAgICJzd2l0Y2giICAgICA+DQotICAgIHwgICA8IFRISVM6ICAgICAgICAgInRoaXMiICAgICAgID4NCi0gICAgfCAgIDwgVEhST1c6ICAgICAgICAidGhyb3ciICAgICAgPg0KLSAgICB8ICAgPCBUUlVFOiAgICAgICAgICJ0cnVlIiAgICAgICA+IA0KLSAgICB8ICAgPCBUUlk6ICAgICAgICAgICJ0cnkiICAgICAgICA+DQotICAgIHwgICA8IFRZUEVPRjogICAgICAgInR5cGVvZiIgICAgID4NCi0gICAgfCAgIDwgVVNFOiAgICAgICAgICAidXNlIiAgICAgICAgPg0KLSAgICB8ICAgPCBWQVI6ICAgICAgICAgICJ2YXIiICAgICAgICA+DQotICAgIHwgICA8IFZPSUQ6ICAgICAgICAgInZvaWQiICAgICAgID4NCi0gICAgfCAgIDwgV0hJTEU6ICAgICAgICAid2hpbGUiICAgICAgPg0KLSAgICB8ICAgPCBXSVRIOiAgICAgICAgICJ3aXRoIiAgICAgICA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRlVUVVJFIFJFU0VSVkVEIFdPUkRTDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBBQlNUUkFDVDogICAgICJhYnN0cmFjdCIgICAgID4NCi0gICAgfCAgIDwgREVCVUdHRVI6ICAgICAiZGVidWdnZXIiICAgICA+DQotICAgIHwgICA8IEVOVU06ICAgICAgICAgImVudW0iICAgICAgICAgPg0KLSAgICB8ICAgPCBFWFBPUlQ6ICAgICAgICJleHBvcnQiICAgICAgID4NCi0gICAgfCAgIDwgR09UTzogICAgICAgICAiZ290byIgICAgICAgICA+DQotICAgIHwgICA8IElNUExFTUVOVFM6ICAgImltcGxlbWVudHMiICAgPg0KLSAgICB8ICAgPCBJTlRFUkZBQ0U6ICAgICJpbnRlcmZhY2UiICAgID4NCi0gICAgfCAgIDwgTkFUSVZFOiAgICAgICAibmF0aXZlIiAgICAgICA+DQotICAgIHwgICA8IFBST1RFQ1RFRDogICAgInByb3RlY3RlZCIgICAgPg0KLSAgICB8ICAgPCBTWU5DSFJPTklaRUQ6ICJzeW5jaHJvbml6ZWQiID4NCi0gICAgfCAgIDwgVEhST1dTOiAgICAgICAidGhyb3dzIiAgICAgICA+DQotICAgIHwgICA8IFRSQU5TSUVOVDogICAgInRyYW5zaWVudCIgICAgPg0KLSAgICB8ICAgPCBWT0xBVElMRTogICAgICJ2b2xhdGlsZSIgICAgID4NCi0gICAgfCAgIDwgSU1QT1JUOiAgICAgICAiaW1wb3J0IiAgICAgICA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gTElURVJBTFMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBERUNJTUFMX0xJVEVSQUw6IFsiMSItIjkiXSAoWyIwIi0iOSJdKSogPg0KLSAgICB8ICAgPCBIRVhfTElURVJBTDogIjAiIFsieCIsIlgiXSAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSkrID4NCi0gICAgfCAgIDwgT0NUQUxfTElURVJBTDogIjAiIChbIjAiLSI3Il0pKiA+DQotICAgIHwgICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6IChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIi4iIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/IA0KLSAgICAgICAgPg0KLSAgICB8ICAgPCAjRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4NCi0gICAgfCAgIDwgU1RSSU5HX0xJVEVSQUw6ICAgIlwiIiAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0pIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiINCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIlwiIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCJcXCJdKSB8ICJcXCIgKCJcbiIgfCAiXHIiIHwgIlxyXG4iKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICANCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIiciDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyINCi0gICAgICAgID4NCi0gICAgfCAgIDwgI0VTQ0FQRV9TRVFVRU5DRTogDQotICAgICAgICAgICAgIlxcIg0KLSAgICAgICAgICAgICggICAgICAgWyJuIiwidCIsImIiLCJyIiwiZiIsIlxcIiwiJyIsIlwiIiwiWyIsIl0iXQ0KLSAgICAgICAgICAgICAgICB8ICAgWyIwIi0iNyJdICggWyIwIi0iNyJdICk/DQotICAgICAgICAgICAgICAgIHwgICBbIjAiLSIzIl0gWyIwIi0iNyJdIFsiMCItIjciXQ0KLSAgICAgICAgICAgICAgICB8ICAgWyJ4Il0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdDQotICAgICAgICAgICAgICAgIHwgICBbInUiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0NCi0gICAgICAgICAgICApDQotICAgICAgICA+DQotICAgIHwgICA8IFVOVEVSTUlOQVRFRF9TVFJJTkdfTElURVJBTDoNCi0gICAgICAgICAgICAgICAgIlwiIiAoICh+WyJcIiIsIlxcIiwiXG4iLCJcciJdKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqICggWyJcbiIsIlxyIl0gKT8NCi0gICAgICAgICAgICB8ICAgIiciICAoICh+WyInIiwiXFwiLCJcbiIsIlxyIl0pICB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqICggWyJcbiIsIlxyIl0gKT8NCi0gICAgICAgID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBSRUdVTEFSIEVYUFJFU1NJT05TIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotVE9LRU4gOg0KLXsgDQotICAgICAgICA8ICNSRUdYX1NUQVJUX0NIQVIgOiB+WyJcciIsIlxuIiwiLyIsIj0iLCIqIl0gfCAiXFwvIj4NCi0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTiA6IH5bIlxyIiwiXG4iLCIvIl0gPiAgDQotICAgIHwgICA8ICNSRUdYX0JPRFlfQ0hBUiA6ICggPFJFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTj4gfCAiXFwvIiApID4NCi0gICAgfCAgIDwgI1JFR0VYX0VORF9DSEFSIDogICAgICJpIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZyIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW0iIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdpIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbSIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWkiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1nIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZ20iIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImltZyIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ21pIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnaW0iIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1pZyIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWdpIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA+DQotfQ0KLQ0KLVRPS0VOIDoNCi17DQotICAgICAgICA8UkVHVUxBUl9FWFBSRVNTSU9OIDogIi8iIDxSRUdYX1NUQVJUX0NIQVI+ICg8UkVHWF9CT0RZX0NIQVI+KSogIi8iICAoPFJFR0VYX0VORF9DSEFSPik/ID4NCi0gICAgICAgIHsNCi0gICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8vIFBlZWsgYXQgdGhlIG5leHQgY2hhcmFjdGVyLg0KLSAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOw0KLSAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOw0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWdWYWxpZCA9PSBmYWxzZSB8fCBuZXh0Q2ggPT0gJy8nIHx8IG5leHRDaCA9PSAnKicpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAvLyBMZXhlY2FsIGFuYWx5c2VyIHRoaW5rcyBpdCBpcyBhIFJFDQotICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRvciBzdWNoIGFzIC8uLi4uLi8NCi0gICAgICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgZXZlcnl0aGluZyB0byB0aGUgZmlyc3QgIi8iIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbQ0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAobGVuZ3RoT2ZNYXRjaC0xKTsNCi0gICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAvLyBBbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHRva2VuDQotICAgICAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmltYWdlID0gbWF0Y2hlZFRva2VuLmltYWdlLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgICAgICAgICAgICAgIGltYWdlLmRlbGV0ZSgwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKCcvJyk7DQotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4ua2luZD1TTEFTSDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgIH0NCi0gICAgICAgfSAgICAgICAgDQotICAgICAgICANCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBJREVOVElGSUVSUyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IElERU5USUZJRVI6IDxMRVRURVI+ICg8TEVUVEVSPnw8RElHSVQ+KSogPg0KLSAgICB8ICAgPCAjTEVUVEVSOiBbImEiLSJ6IiwiQSItIloiLCIkIiwiXyJdID4NCi0gICAgfCAgIDwgI0RJR0lUOiBbIjAiLSI5Il0+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gU0VQQVJBVE9SUyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IExQQVJFTjogICAgIigiICAgPg0KLSAgICB8ICAgPCBSUEFSRU46ICAgICIpIiAgID4NCi0gICAgfCAgIDwgTEJSQUNFOiAgICAieyIgICA+DQotICAgIHwgICA8IFJCUkFDRTogICAgIn0iICAgPg0KLSAgICB8ICAgPCBMQlJBQ0tFVDogICJbIiAgID4NCi0gICAgfCAgIDwgUkJSQUNLRVQ6ICAiXSIgICA+DQotICAgIHwgICA8IFNFTUlDT0xPTjogIjsiICAgPg0KLSAgICB8ICAgPCBDT01NQTogICAgICIsIiAgID4NCi0gICAgfCAgIDwgRE9UOiAgICAgICAiLiIgICA+DQotICAgIHwgICA8IFFVQUxJRklFUjogIjo6IiAgPg0KLSAgICB8ICAgPCBFTElQU0U6ICAgICIuLi4iID4NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBPUEVSQVRPUlMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBBU1NJR046ICAgICAgICAgICAgICAgIj0iICAgID4NCi0gICAgfCAgIDwgR1Q6ICAgICAgICAgICAgICAgICAgICI+IiAgICA+DQotICAgIHwgICA8IExUOiAgICAgICAgICAgICAgICAgICAiPCIgICAgPg0KLSAgICB8ICAgPCBCQU5HOiAgICAgICAgICAgICAgICAgIiEiICAgID4NCi0gICAgfCAgIDwgVElMREU6ICAgICAgICAgICAgICAgICJ+IiAgICA+DQotICAgIHwgICA8IEhPT0s6ICAgICAgICAgICAgICAgICAiPyIgICAgPg0KLSAgICB8ICAgPCBDT0xPTjogICAgICAgICAgICAgICAgIjoiICAgID4NCi0gICAgfCAgIDwgRVE6ICAgICAgICAgICAgICAgICAgICI9PSIgICA+DQotICAgIHwgICA8IExFOiAgICAgICAgICAgICAgICAgICAiPD0iICAgPg0KLSAgICB8ICAgPCBHRTogICAgICAgICAgICAgICAgICAgIj49IiAgID4NCi0gICAgfCAgIDwgTkU6ICAgICAgICAgICAgICAgICAgICIhPSIgICA+DQotICAgIHwgICA8IFNDX09SOiAgICAgICAgICAgICAgICAifHwiICAgPg0KLSAgICB8ICAgPCBTQ19BTkQ6ICAgICAgICAgICAgICAgIiYmIiAgID4NCi0gICAgfCAgIDwgU0NfWE9SOiAgICAgICAgICAgICAgICJeXiIgICA+DQotICAgIHwgICA8IElOQ1I6ICAgICAgICAgICAgICAgICAiKysiICAgPg0KLSAgICB8ICAgPCBERUNSOiAgICAgICAgICAgICAgICAgIi0tIiAgID4NCi0gICAgfCAgIDwgUExVUzogICAgICAgICAgICAgICAgICIrIiAgICA+DQotICAgIHwgICA8IE1JTlVTOiAgICAgICAgICAgICAgICAiLSIgICAgPg0KLSAgICB8ICAgPCBTVEFSOiAgICAgICAgICAgICAgICAgIioiICAgID4NCi0gICAgfCAgIDwgU0xBU0g6ICAgICAgICAgICAgICAgICIvIiAgICA+DQotICAgIHwgICA8IEJJVF9BTkQ6ICAgICAgICAgICAgICAiJiIgICAgPg0KLSAgICB8ICAgPCBCSVRfT1I6ICAgICAgICAgICAgICAgInwiICAgID4NCi0gICAgfCAgIDwgWE9SOiAgICAgICAgICAgICAgICAgICJeIiAgICA+DQotICAgIHwgICA8IFJFTTogICAgICAgICAgICAgICAgICAiJSIgICAgPg0KLSAgICB8ICAgPCBMU0hJRlQ6ICAgICAgICAgICAgICAgIjw8IiAgID4NCi0gICAgfCAgIDwgUlNJR05FRFNISUZUOiAgICAgICAgICI+PiIgICA+DQotICAgIHwgICA8IFJVTlNJR05FRFNISUZUOiAgICAgICAiPj4+IiAgPg0KLSAgICB8ICAgPCBQTFVTQVNTSUdOOiAgICAgICAgICAgIis9IiAgID4NCi0gICAgfCAgIDwgTUlOVVNBU1NJR046ICAgICAgICAgICItPSIgICA+DQotICAgIHwgICA8IFNUQVJBU1NJR046ICAgICAgICAgICAiKj0iICAgPg0KLSAgICB8ICAgPCBTTEFTSEFTU0lHTjogICAgICAgICAgIi89IiAgID4NCi0gICAgfCAgIDwgQU5EQVNTSUdOOiAgICAgICAgICAgICImPSIgICA+DQotICAgIHwgICA8IE9SQVNTSUdOOiAgICAgICAgICAgICAifD0iICAgPg0KLSAgICB8ICAgPCBYT1JBU1NJR046ICAgICAgICAgICAgIl49IiAgID4NCi0gICAgfCAgIDwgUkVNQVNTSUdOOiAgICAgICAgICAgICIlPSIgICA+DQotICAgIHwgICA8IExTSElGVEFTU0lHTjogICAgICAgICAiPDw9IiAgPg0KLSAgICB8ICAgPCBSU0lHTkVEU0hJRlRBU1NJR046ICAgIj4+PSIgID4NCi0gICAgfCAgIDwgUlVOU0lHTkVEU0hJRlRBU1NJR046ICI+Pj49IiA+DQotICAgIHwgICA8IFNDX09SQVNTSUdOOiAgICAgICAgICAifHw9IiAgPg0KLSAgICB8ICAgPCBTQ19BTkRBU1NJR046ICAgICAgICAgIiYmPSIgID4NCi0gICAgfCAgIDwgU0NfWE9SQVNTSUdOOiAgICAgICAgICJeXj0iICA+DQotICAgIHwgICA8IElERU5USVRZT1BFUjogICAgICAgICAiPT09IiAgPg0KLSAgICB8ICAgPCBOT1RJREVOVElUWU9QRVI6ICAgICAgIiE9PSIgID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEdSQU1NQVIgU2VjdGlvbg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi1Ub2tlbiBQcm9ncmFtKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcm9ncmFtICovDQotICAgICAgICBBU1RQcm9ncmFtIGpqdG4wMDAgPSBuZXcgQVNUUHJvZ3JhbSh0aGlzLCBKSlRQUk9HUkFNKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHJldHZhbCA9IGdldFRva2VuKDEpOw0KLX0NCi17LypAYmdlbihqanRyZWUpIFByb2dyYW0gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoUGFja2FnZURlZmluaXRpb24oKSkqIFtEaXJlY3RpdmVzKCldIDxFT0Y+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICB9DQotLypAZWdlbiovDQotICAgICAgICB7DQotICAgICAgICAgICAgX2pqdFJvb3QgPSBqanRuMDAwOw0KLSAgICAgICAgICAgIHJldHVybiByZXR2YWw7DQotICAgICAgICB9LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFeHByZXNzaW9ucyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gSWRlbnRpZmllciANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgSWRlbnRpZmllcigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgSWRlbnRpZmllciAqLw0KLSAgQVNUSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVElkZW50aWZpZXIodGhpcywgSkpUSURFTlRJRklFUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgSWRlbnRpZmllciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxJREVOVElGSUVSPg0KLSAgICB8ICAgPEdFVD4NCi0gICAgfCAgIDxTRVQ+DQotICAgIHwgICA8SU5DTFVERT4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi0vLyAgICB8ICAgPE5BTUVTUEFDRT4NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBRdWFsaWZpZWQgSWRlbnRpZmllciANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciAqLw0KLSAgQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIodGhpcywgSkpUU0lNUExFUVVBTElGSUVESURFTlRJRklFUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICBJZGVudGlmaWVyKCkgWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0NCi0gICAgfCAgUmVzZXJ2ZWROYW1lc3BhY2UoKSBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLXZvaWQgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKToNCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyICovDQotICBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKHRoaXMsIEpKVEVYUFJFU1NJT05RVUFMSUZJRURJREVOVElGSUVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICA8TFBBUkVOPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+IDxRVUFMSUZJRVI+IElkZW50aWZpZXIoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBRdWFsaWZpZWRJZGVudGlmaWVyKCk6DQotey8qQGJnZW4oamp0cmVlKSBRdWFsaWZpZWRJZGVudGlmaWVyICovDQotICBBU1RRdWFsaWZpZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUUXVhbGlmaWVkSWRlbnRpZmllcih0aGlzLCBKSlRRVUFMSUZJRURJREVOVElGSUVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBRdWFsaWZpZWRJZGVudGlmaWVyICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKQ0KLSAgICB8ICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgIH0NCi0gICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFByaW1hcnkgRXhwcmVzc2lvbnMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgUHJpbWFyeUV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmltYXJ5RXhwcmVzc2lvbiAqLw0KLSAgQVNUUHJpbWFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RQcmltYXJ5RXhwcmVzc2lvbih0aGlzLCBKSlRQUklNQVJZRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJpbWFyeUV4cHJlc3Npb24gKi8NCi0gICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgKA0KLSAgICAgICAgPE5VTEw+DQotICAgIHwgICA8VFJVRT4NCi0gICAgfCAgIDxGQUxTRT4NCi0gICAgfCAgIDxERUNJTUFMX0xJVEVSQUw+IA0KLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+DQotICAgIHwgICA8SEVYX0xJVEVSQUw+DQotICAgIHwgICA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gDQotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+IA0KLSAgICB8ICAgPFRISVM+DQotICAgIHwgICA8UkVHVUxBUl9FWFBSRVNTSU9OPg0KLSAgICB8ICAgPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPg0KLSAgICB8ICAgQXJyYXlMaXRlcmFsKCkNCi0gICAgfCAgIE9iamVjdExpdGVyYWwoKQ0KLSAgICB8ICAgRnVuY3Rpb25FeHByZXNzaW9uKCkNCi0gICAgKS8qQGJnZW4oamp0cmVlKSovDQotICAgIHsNCi0gICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICB9DQotLypAZWdlbiovDQotICAgIHsNCi0gICAgICAgIHRva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpOw0KLSAgICB9LypAYmdlbihqanRyZWUpKi8NCi0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgfSBmaW5hbGx5IHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgIH0NCi0gICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlc2VydmVkTmFtZXNwYWNlICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVzZXJ2ZWROYW1lc3BhY2UgKi8NCi0gIEFTVFJlc2VydmVkTmFtZXNwYWNlIGpqdG4wMDAgPSBuZXcgQVNUUmVzZXJ2ZWROYW1lc3BhY2UodGhpcywgSkpUUkVTRVJWRUROQU1FU1BBQ0UpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFJlc2VydmVkTmFtZXNwYWNlICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIDxQVUJMSUM+DQotICAgIHwgIDxQUk9URUNURUQ+DQotICAgIHwgIDxQUklWQVRFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBGdW5jdGlvbiBFeHByZXNzaW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkICBGdW5jdGlvbkV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkV4cHJlc3Npb24gKi8NCi0gIEFTVEZ1bmN0aW9uRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uRXhwcmVzc2lvbih0aGlzLCBKSlRGVU5DVElPTkVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgyKSA8RlVOQ1RJT04+IEZ1bmN0aW9uQ29tbW9uKCkNCi0gICAgfCAgICAgICAgICAgICAgICA8RlVOQ1RJT04+IElkZW50aWZpZXIoKSBGdW5jdGlvbkNvbW1vbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBPYmplY3QgTGl0ZXJhbHMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgT2JqZWN0TGl0ZXJhbCAoKToNCi17LypAYmdlbihqanRyZWUpIE9iamVjdExpdGVyYWwgKi8NCi0gIEFTVE9iamVjdExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RPYmplY3RMaXRlcmFsKHRoaXMsIEpKVE9CSkVDVExJVEVSQUwpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIE9iamVjdExpdGVyYWwgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TEJSQUNFPiBbRmllbGRMaXN0KCldIDxSQlJBQ0U+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8gIA0KLX0gICAgICAgIA0KLQ0KLXZvaWQgRmllbGRMaXN0KCk6DQotey8qQGJnZW4oamp0cmVlKSBGaWVsZExpc3QgKi8NCi0gIEFTVEZpZWxkTGlzdCBqanRuMDAwID0gbmV3IEFTVEZpZWxkTGlzdCh0aGlzLCBKSlRGSUVMRExJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZpZWxkTGlzdCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExpdGVyYWxGaWVsZCgpICg8Q09NTUE+IExpdGVyYWxGaWVsZCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExpdGVyYWxGaWVsZCAoKToNCi17LypAYmdlbihqanRyZWUpIExpdGVyYWxGaWVsZCAqLw0KLSAgQVNUTGl0ZXJhbEZpZWxkIGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbEZpZWxkKHRoaXMsIEpKVExJVEVSQUxGSUVMRCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbEZpZWxkICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRmllbGROYW1lKCkgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGaWVsZE5hbWUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBGaWVsZE5hbWUgKi8NCi0gIEFTVEZpZWxkTmFtZSBqanRuMDAwID0gbmV3IEFTVEZpZWxkTmFtZSh0aGlzLCBKSlRGSUVMRE5BTUUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZpZWxkTmFtZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTVFJJTkdfTElURVJBTD4NCi0gICAgfCAgIDxERUNJTUFMX0xJVEVSQUw+DQotICAgIHwgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkNCi0gICAgfCAgIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0JDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBBcnJheSBMaXRlcmFsDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEFycmF5TGl0ZXJhbCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXJyYXlMaXRlcmFsICovDQotICBBU1RBcnJheUxpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RBcnJheUxpdGVyYWwodGhpcywgSkpUQVJSQVlMSVRFUkFMKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBcnJheUxpdGVyYWwgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TEJSQUNLRVQ+IFtFbGVtZW50TGlzdCgpXSA8UkJSQUNLRVQ+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBFbGVtZW50TGlzdCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRWxlbWVudExpc3QgKi8NCi0gIEFTVEVsZW1lbnRMaXN0IGpqdG4wMDAgPSBuZXcgQVNURWxlbWVudExpc3QodGhpcywgSkpURUxFTUVOVExJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEVsZW1lbnRMaXN0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTGl0ZXJhbEVsZW1lbnQoKSAoPENPTU1BPiBMaXRlcmFsRWxlbWVudCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExpdGVyYWxFbGVtZW50KCk6DQotey8qQGJnZW4oamp0cmVlKSBMaXRlcmFsRWxlbWVudCAqLw0KLSAgQVNUTGl0ZXJhbEVsZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsRWxlbWVudCh0aGlzLCBKSlRMSVRFUkFMRUxFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbEVsZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBTdXBlciBFeHByZXNzaW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFN1cGVyRXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFN1cGVyRXhwcmVzc2lvbiAqLw0KLSAgQVNUU3VwZXJFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUU3VwZXJFeHByZXNzaW9uKHRoaXMsIEpKVFNVUEVSRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgU3VwZXJFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFNVUEVSPiBbTE9PS0FIRUFEKDIpIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj5dLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBQb3N0Zml4IEV4cHJlc3Npb24NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgUG9zdGZpeEV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBQb3N0Zml4RXhwcmVzc2lvbiAqLw0KLSAgQVNUUG9zdGZpeEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RQb3N0Zml4RXhwcmVzc2lvbih0aGlzLCBKSlRQT1NURklYRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBdHRyaWJ1dGVFeHByZXNzaW9uICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQb3N0Zml4T3AoKV0NCi0gICAgfCAgIHt0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpO30gDQotICAgICAgICBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKCkgKFByb3BlcnR5T3JBcmd1bWVudHMoKSkqIFtQb3N0Zml4T3AoKV0NCi0gICAgfCAgIFN1cGVyRXhwcmVzc2lvbigpICAgICAgICAgUHJvcGVydHlPcGVyYXRvcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19ICAgIA0KLQ0KLXZvaWQgQXR0cmlidXRlRXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZUV4cHJlc3Npb24gKi8NCi0gIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGVFeHByZXNzaW9uKHRoaXMsIEpKVEFUVFJJQlVURUVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkgIChQcm9wZXJ0eU9yQXJndW1lbnRzKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVsbFBvc3RmaXhFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVsbFBvc3RmaXhFeHByZXNzaW9uICovDQotICBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24odGhpcywgSkpURlVMTFBPU1RGSVhFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKi8NCi0gICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgTE9PS0FIRUFEKDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gPFFVQUxJRklFUj4pIA0KLSAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpDQotICAgIHwgIFByaW1hcnlFeHByZXNzaW9uKCkgDQotICAgIHwgIEZ1bGxOZXdFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgfQ0KLSAgICAgICB9DQotLypAZWdlbiovICAgICAgICAgICAgIA0KLX0NCi0NCi12b2lkIEZ1bGxOZXdFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVsbE5ld0V4cHJlc3Npb24gKi8NCi0gIEFTVEZ1bGxOZXdFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURnVsbE5ld0V4cHJlc3Npb24odGhpcywgSkpURlVMTE5FV0VYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZ1bGxOZXdFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPE5FVz4gRnVsbE5ld1N1YmV4cHJlc3Npb24oKSAgKExPT0tBSEVBRCgyKSBQcm9wZXJ0eU9wZXJhdG9yKCkpKiBbTE9PS0FIRUFEKDIpIEFyZ3VtZW50cygpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25Db25zdHJ1Y3RvcigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25Db25zdHJ1Y3RvciAqLw0KLSAgQVNURnVuY3Rpb25Db25zdHJ1Y3RvciBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uQ29uc3RydWN0b3IodGhpcywgSkpURlVOQ1RJT05DT05TVFJVQ1RPUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25Db25zdHJ1Y3RvciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8gICAgDQotICAgICAgICA8RlVOQ1RJT05fPiBBcmd1bWVudHMoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVsbE5ld1N1YmV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdWxsTmV3U3ViZXhwcmVzc2lvbiAqLw0KLSAgQVNURnVsbE5ld1N1YmV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbih0aGlzLCBKSlRGVUxMTkVXU1VCRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVsbE5ld1N1YmV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiA8UVVBTElGSUVSPikgDQotICAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpICAgICAgICANCi0gICAgfCAgIFByaW1hcnlFeHByZXNzaW9uKCkgDQotICAgIHwgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkNCi0gICAgfCAgIFN1cGVyRXhwcmVzc2lvbigpIA0KLSAgICB8ICAgRnVsbE5ld0V4cHJlc3Npb24oKQ0KLSAgICB8ICAgRnVuY3Rpb25Db25zdHJ1Y3RvcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotDQotdm9pZCBQb3N0Zml4T3AoKToNCi17LypAYmdlbihqanRyZWUpIFBvc3RmaXhPcCAqLw0KLSAgQVNUUG9zdGZpeE9wIGpqdG4wMDAgPSBuZXcgQVNUUG9zdGZpeE9wKHRoaXMsIEpKVFBPU1RGSVhPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeE9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPElOQ1I+DQotICAgIHwgICA8REVDUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQcm9wZXJ0eU9yQXJndW1lbnRzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJvcGVydHlPckFyZ3VtZW50cyAqLw0KLSAgQVNUUHJvcGVydHlPckFyZ3VtZW50cyBqanRuMDAwID0gbmV3IEFTVFByb3BlcnR5T3JBcmd1bWVudHModGhpcywgSkpUUFJPUEVSVFlPUkFSR1VNRU5UUyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJvcGVydHlPckFyZ3VtZW50cyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFyZ3VtZW50cygpICAgICAgICANCi0gICAgfCAgIFByb3BlcnR5T3BlcmF0b3IoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUHJvcGVydHkgT3BlcmF0b3JzDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFByb3BlcnR5T3BlcmF0b3IgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9wZXJhdG9yICovDQotICBBU1RQcm9wZXJ0eU9wZXJhdG9yIGpqdG4wMDAgPSBuZXcgQVNUUHJvcGVydHlPcGVyYXRvcih0aGlzLCBKSlRQUk9QRVJUWU9QRVJBVE9SKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9wZXJhdG9yICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLyAgICAgICAgICANCi0gICAgICAgIDxET1Q+ICAgICAgUXVhbGlmaWVkSWRlbnRpZmllcigpDQotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8UkJSQUNLRVQ+DQotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4NCi0gICAgfCAgICAgICAgICAgICAgICA8TEJSQUNLRVQ+IExpc3RFeHByZXNzaW9uKCkgWzxFTElQU0U+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldIDxSQlJBQ0tFVD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFyZ3VtZW50cyAoKToNCi17LypAYmdlbihqanRyZWUpIEFyZ3VtZW50cyAqLw0KLSBBU1RBcmd1bWVudHMgamp0bjAwMCA9IG5ldyBBU1RBcmd1bWVudHModGhpcywgSkpUQVJHVU1FTlRTKTsNCi0gYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiove3Rva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpO319DQotey8qQGJnZW4oamp0cmVlKSBBcmd1bWVudHMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMikgPExQQVJFTj4gPFJQQVJFTj4NCi0gICAgfCAgIExPT0tBSEVBRCgyKSA8TFBBUkVOPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+DQotICAgIHwgICAgICAgICAgICAgICAgPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSBbPEVMSVBTRT4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0gPFJQQVJFTj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFVuYXJ5IE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVW5hcnlFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovDQotICBBU1RVbmFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RVbmFyeUV4cHJlc3Npb24odGhpcywgSkpUVU5BUllFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8NCi0gICAgICAgICAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgICAgICAgICBQb3N0Zml4RXhwcmVzc2lvbigpDQotICAgIHwgICA8REVMRVRFPiBQb3N0Zml4RXhwcmVzc2lvbigpDQotICAgIHwgICA8Vk9JRD4gICBVbmFyeUV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPFRZUEVPRj4gVW5hcnlFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxJTkNSPiAgIFBvc3RmaXhFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxERUNSPiAgIFBvc3RmaXhFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxQTFVTPiAgIFVuYXJ5RXhwcmVzc2lvbigpDQotICAgIHwgICA8TUlOVVM+ICBVbmFyeUV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPFRJTERFPiAgVW5hcnlFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxCQU5HPiAgIFVuYXJ5RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBNdWx0aXBsaWNhdGl2ZSBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIE11bE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBNdWxPcCAqLw0KLSAgQVNUTXVsT3Agamp0bjAwMCA9IG5ldyBBU1RNdWxPcCh0aGlzLCBKSlRNVUxPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTXVsT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U1RBUj4NCi0gICAgfCAgIDxTTEFTSD4NCi0gICAgfCAgIDxSRU0+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovIA0KLX0NCi0NCi12b2lkIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICovDQotICBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24odGhpcywgSkpUTVVMVElQTElDQVRJVkVFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoTXVsT3AoKSBVbmFyeUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi0NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBBZGRpdGl2ZSBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEFkZE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBBZGRPcCAqLw0KLSAgQVNUQWRkT3Agamp0bjAwMCA9IG5ldyBBU1RBZGRPcCh0aGlzLCBKSlRBRERPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQWRkT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8UExVUz4NCi0gICAgfCAgIDxNSU5VUz4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBZGRpdGl2ZUV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEFkZGl0aXZlRXhwcmVzc2lvbiAqLw0KLSAgQVNUQWRkaXRpdmVFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQWRkaXRpdmVFeHByZXNzaW9uKHRoaXMsIEpKVEFERElUSVZFRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQWRkaXRpdmVFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgKEFkZE9wKCkgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfSANCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEJpdHdpc2UgU2hpZnQgT3BlcmF0b3JzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTaGlmdE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBTaGlmdE9wICovDQotICBBU1RTaGlmdE9wIGpqdG4wMDAgPSBuZXcgQVNUU2hpZnRPcCh0aGlzLCBKSlRTSElGVE9QKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTaGlmdE9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPExTSElGVD4NCi0gICAgfCAgIDxSU0lHTkVEU0hJRlQ+DQotICAgIHwgICA8UlVOU0lHTkVEU0hJRlQ+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgU2hpZnRFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBTaGlmdEV4cHJlc3Npb24gKi8NCi0gIEFTVFNoaWZ0RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFNoaWZ0RXhwcmVzc2lvbih0aGlzLCBKSlRTSElGVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFNoaWZ0RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFkZGl0aXZlRXhwcmVzc2lvbigpIChTaGlmdE9wKCkgQWRkaXRpdmVFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUmVsYXRpb25hbCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFJlbE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBSZWxPcCAqLw0KLSAgQVNUUmVsT3Agamp0bjAwMCA9IG5ldyBBU1RSZWxPcCh0aGlzLCBKSlRSRUxPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVsT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TFQ+DQotICAgIHwgICA8R1Q+IA0KLSAgICB8ICAgPExFPiANCi0gICAgfCAgIDxHRT4NCi0gICAgfCAgIDxJUz4NCi0gICAgfCAgIDxBUz4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVsYXRpb25hbEV4cHJlc3Npb24gKi8NCi0gIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFJlbGF0aW9uYWxFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCkgDQotICAgICAgICAgICAgKExPT0tBSEVBRCgzKShSZWxPcCgpIHwgPElOPiB8IDxJTlNUQU5DRU9GPiApIFNoaWZ0RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOICovDQotICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSANCi0gICAgICAgICAgICAoKFJlbE9wKCkgfCA8SU5TVEFOQ0VPRj4pICBTaGlmdEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFcXVhbGl0eSBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEVxdWFsT3AoKToNCi17LypAYmdlbihqanRyZWUpIEVxdWFsT3AgKi8NCi0gIEFTVEVxdWFsT3Agamp0bjAwMCA9IG5ldyBBU1RFcXVhbE9wKHRoaXMsIEpKVEVRVUFMT1ApOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEVxdWFsT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8RVE+IA0KLSAgICB8ICAgPE5FPiANCi0gICAgfCAgIDxJREVOVElUWU9QRVI+IA0KLSAgICB8ICAgPE5PVElERU5USVRZT1BFUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEVxdWFsaXR5RXhwcmVzc2lvbiAqLw0KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKHRoaXMsIEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAoRXF1YWxPcCgpIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4odGhpcywgSkpURVFVQUxJVFlFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQmluYXJ5IEJpdHdpc2UgT3BlcmF0b3JzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBCaXR3aXNlQU5ET3AoKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRPcCAqLw0KLSAgQVNUQml0d2lzZUFORE9wIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFORE9wKHRoaXMsIEpKVEJJVFdJU0VBTkRPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFORE9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPEJJVF9BTkQ+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQml0d2lzZUFOREV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uICovDQotICBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlQU5ERXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpIChCaXR3aXNlQU5ET3AoKSBFcXVhbGl0eUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlQU5ET3AoKSBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLQ0KLXZvaWQgQml0d2lzZVhPUk9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9ST3AgKi8NCi0gIEFTVEJpdHdpc2VYT1JPcCBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JPcCh0aGlzLCBKSlRCSVRXSVNFWE9ST1ApOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JPcCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxYT1I+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JFeHByZXNzaW9uICovDQotICBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VYT1JFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9SRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uKCkgKEJpdHdpc2VYT1JPcCgpIEJpdHdpc2VBTkRFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRCSVRXSVNFWE9SRVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlWE9ST3AoKSBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlT1JPcCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9ST3AgKi8NCi0gIEFTVEJpdHdpc2VPUk9wIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9ST3AodGhpcywgSkpUQklUV0lTRU9ST1ApOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VPUk9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPEJJVF9PUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uICovDQotICBBU1RCaXR3aXNlT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9SRXhwcmVzc2lvbih0aGlzLCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb24oKSAoQml0d2lzZU9ST3AoKSBCaXR3aXNlWE9SRXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZU9ST3AoKSBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBCaW5hcnkgTG9naWNhbCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsQU5ERXhwcmVzc2lvbiAqLw0KLSAgQVNUTG9naWNhbEFOREV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbih0aGlzLCBKSlRMT0dJQ0FMQU5ERVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbEFOREV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCkgKDxTQ19BTkQ+IEJpdHdpc2VPUkV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKToNCi17LypAYmdlbihqanRyZWUpIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVExPR0lDQUxBTkRFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKSAoPFNDX0FORD4gQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBMb2dpY2FsT1JFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uICovDQotICBBU1RMb2dpY2FsT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTG9naWNhbE9SRXhwcmVzc2lvbih0aGlzLCBKSlRMT0dJQ0FMT1JFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTG9naWNhbEFOREV4cHJlc3Npb24oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMT0dJQ0FMT1JFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBDb25kaXRpb25hbCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ29uZGl0aW9uYWxFeHByZXNzaW9uICovDQotICBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBDb25kaXRpb25hbEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uKCkgWzxIT09LPiAgQXNzaWdubWVudEV4cHJlc3Npb24oKSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgIFs8SE9PSz4gIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTm9uQXNzaWdubWVudEV4cHJlc3Npb24gKi8NCi0gIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24odGhpcywgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbigpIFs8SE9PSz4gIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOICovDQotICBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTigpIFs8SE9PSz4gIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEFzc2lnbm1lbnQgT3BlcmF0b3JzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBBc3NpZ25lbWVudE9wZXJhdG9yKCk6DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25lbWVudE9wZXJhdG9yICovDQotICBBU1RBc3NpZ25lbWVudE9wZXJhdG9yIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWduZW1lbnRPcGVyYXRvcih0aGlzLCBKSlRBU1NJR05FTUVOVE9QRVJBVE9SKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25lbWVudE9wZXJhdG9yICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPEFTU0lHTj4NCi0gICAgfCAgIDxTVEFSQVNTSUdOPg0KLSAgICB8ICAgPFNMQVNIQVNTSUdOPiANCi0gICAgfCAgIDxSRU1BU1NJR04+IA0KLSAgICB8ICAgPFBMVVNBU1NJR04+DQotICAgIHwgICA8TUlOVVNBU1NJR04+IA0KLSAgICB8ICAgPExTSElGVEFTU0lHTj4gDQotICAgIHwgICA8UlNJR05FRFNISUZUQVNTSUdOPg0KLSAgICB8ICAgPFJVTlNJR05FRFNISUZUQVNTSUdOPg0KLSAgICB8ICAgPEFOREFTU0lHTj4gDQotICAgIHwgICA8WE9SQVNTSUdOPiANCi0gICAgfCAgIDxPUkFTU0lHTj4NCi0gICAgfCAgIDxTQ19BTkRBU1NJR04+DQotICAgIHwgICA8U0NfWE9SQVNTSUdOPg0KLSAgICB8ICAgPFNDX09SQVNTSUdOPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLSANCi19DQotDQotdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXNzaWdubWVudEV4cHJlc3Npb24gKi8NCi0gIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWdubWVudEV4cHJlc3Npb24odGhpcywgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEFzc2lnbm1lbnRFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgW0xPT0tBSEVBRCgyKSBBc3NpZ25lbWVudE9wZXJhdG9yKCkgQXNzaWdubWVudEV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOICovDQotICBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgW0xPT0tBSEVBRCgyKSBBc3NpZ25lbWVudE9wZXJhdG9yKCkgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBDb21tYSBFeHByZXNzaW9ucw0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBMaXN0RXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uICovDQotICBBU1RMaXN0RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVExpc3RFeHByZXNzaW9uKHRoaXMsIEpKVExJU1RFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMaXN0RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKDxDT01NQT4gQXNzaWdubWVudEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19ICAgDQotDQotdm9pZCBMaXN0RXhwcmVzc2lvbk5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBMaXN0RXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVExpc3RFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVExpc3RFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMSVNURVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpICg8Q09NTUE+IEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0gICANCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFR5cGUgRXhwcmVzc2lvbnMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVHlwZUV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbiAqLw0KLSAgQVNUVHlwZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RUeXBlRXhwcmVzc2lvbih0aGlzLCBKSlRUWVBFRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVHlwZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBUeXBlRXhwcmVzc2lvbk5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVFR5cGVFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRUWVBFRVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBUeXBlRXhwcmVzc2lvbkxpc3QgKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbkxpc3QgKi8NCi0gIEFTVFR5cGVFeHByZXNzaW9uTGlzdCBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uTGlzdCh0aGlzLCBKSlRUWVBFRVhQUkVTU0lPTkxJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTGlzdCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKDxDT01NQT4gTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBTdGFlbWVudHMgKGFiYnJldiwgbm9TaG9ydElmLCBmdWxsKSANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU3RhdGVtZW50ICovDQotICBBU1RTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTdGF0ZW1lbnQodGhpcywgSkpUU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgRXhwcmVzc2lvblN0YXRlbWVudCgpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICBTdXBlclN0YXRlbWVudCgpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICBCbG9jaygpDQotICAgIHwgICAgICAgICAgICAgICAgTGFiZWxlZFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgSWZTdGF0ZW1lbnQoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFN3aXRjaFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgRG9TdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgV2hpbGVTdGF0ZW1lbnQoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEZvclN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgV2l0aFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgQ29udGludWVTdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgQnJlYWtTdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgUmV0dXJuU3RhdGVtZW50KCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFRocm93U3RhdGVtZW50KCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFRyeVN0YXRlbWVudCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBTdWJzdGF0ZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBTdWJzdGF0ZW1lbnQgKi8NCi0gIEFTVFN1YnN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN1YnN0YXRlbWVudCh0aGlzLCBKSlRTVUJTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudCAqLw0KLSAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgICAgICAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKQ0KLSAgICB8ICAgTE9PS0FIRUFEKDIpIFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uKCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgICAgIDxMQlJBQ0U+IFN1YnN0YXRlbWVudHMoKSA8UkJSQUNFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFN1YnN0YXRlbWVudHMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBTdWJzdGF0ZW1lbnRzICovDQotICBBU1RTdWJzdGF0ZW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUU3Vic3RhdGVtZW50cyh0aGlzLCBKSlRTVUJTVEFURU1FTlRTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTdWJzdGF0ZW1lbnRzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKFN1YnN0YXRlbWVudCgpKSsvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi1KQVZBQ09ERQ0KLSAgdm9pZCBTYygpIHsvKkBiZ2VuKGpqdHJlZSkgU2MgKi8NCi0gQVNUU2Mgamp0bjAwMCA9IG5ldyBBU1RTYyh0aGlzLCBKSlRTQyk7DQotIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICBUb2tlbiB0b2sgPSBnZXRUb2tlbigxKTsNCi0gICAgaWYgKHRvay5raW5kID09IFNFTUlDT0xPTikgew0KLSAgICAgICB0b2sgPSBnZXROZXh0VG9rZW4oKTsNCi0gICAgfSBlbHNlIGlmICh0b2suc3BlY2lhbFRva2VuICE9IG51bGwpIHsNCi0gICAgICAgaWYgKCFFb2xDb21tZW50U2tpcFdzKHRvay5zcGVjaWFsVG9rZW4pICYmICh0b2sua2luZCAhPSBFT0YpKSB7DQotICAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsNCi0gICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKCh0b2sua2luZCAhPSBFT0YpICYmICh0b2sua2luZCE9UkJSQUNFKSkgew0KLSAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsNCi0gICAgfS8qQGJnZW4oamp0cmVlKSovDQotIH0gZmluYWxseSB7DQotICAgaWYgKGpqdGMwMDApIHsNCi0gICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICB9DQotIH0NCi0vKkBlZ2VuKi8NCi0gIH0NCi0gDQotSkFWQUNPREUNCi0gIGJvb2xlYW4gRW9sQ29tbWVudFNraXBXcyhUb2tlbiB0KSB7LypAYmdlbihqanRyZWUpIEVvbENvbW1lbnRTa2lwV3MgKi8NCi0gQVNURW9sQ29tbWVudFNraXBXcyBqanRuMDAwID0gbmV3IEFTVEVvbENvbW1lbnRTa2lwV3ModGhpcywgSkpURU9MQ09NTUVOVFNLSVBXUyk7DQotIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICBib29sZWFuIHJldFZhbCA9IGZhbHNlOw0KLSAgICBUb2tlbiBzcGVjaWFsVG9rZW4gPSB0Ow0KLSAgICB3aGlsZShzcGVjaWFsVG9rZW4gIT0gbnVsbCkgew0KLSAgICAgIGlmKHNwZWNpYWxUb2tlbi5raW5kID09IFdTKSB7DQotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOw0KLSAgICAgICAgY29udGludWU7DQotICAgICAgfQ0KLSAgICAgIGVsc2UgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gRU9MICB8fA0KLSAgICAgICAgICAgICAgc3BlY2lhbFRva2VuLmtpbmQgPT0gU0lOR0xFX0xJTkVfQ09NTUVOVCkgew0KLSAgICAgICAgcmV0VmFsID0gdHJ1ZTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgICBlbHNlIHsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcmV0VmFsOy8qQGJnZW4oamp0cmVlKSovDQotIH0gZmluYWxseSB7DQotICAgaWYgKGpqdGMwMDApIHsNCi0gICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICB9DQotIH0NCi0vKkBlZ2VuKi8NCi0gIH0NCi0gDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFbXB0eSBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEVtcHR5U3RhdGVtZW50KCk6DQotey8qQGJnZW4oamp0cmVlKSBFbXB0eVN0YXRlbWVudCAqLw0KLSAgQVNURW1wdHlTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RFbXB0eVN0YXRlbWVudCh0aGlzLCBKSlRFTVBUWVNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRW1wdHlTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U0VNSUNPTE9OPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEV4cHJlc2lvbiBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEV4cHJlc3Npb25TdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb25TdGF0ZW1lbnQgKi8NCi0gIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMsIEpKVEVYUFJFU1NJT05TVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb25TdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMaXN0RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gU3VwZXIgU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTdXBlclN0YXRlbWVudCAoKToNCi17LypAYmdlbihqanRyZWUpIFN1cGVyU3RhdGVtZW50ICovDQotICBBU1RTdXBlclN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN1cGVyU3RhdGVtZW50KHRoaXMsIEpKVFNVUEVSU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTdXBlclN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTVVBFUj4gQXJndW1lbnRzKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEJsb2NrIFN0YXRlbWVudCANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQmxvY2sgKCk6DQotey8qQGJnZW4oamp0cmVlKSBCbG9jayAqLw0KLSAgQVNUQmxvY2sgamp0bjAwMCA9IG5ldyBBU1RCbG9jayh0aGlzLCBKSlRCTE9DSyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQmxvY2sgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovICAgDQotICAgICAgICA8TEJSQUNFPiBbRGlyZWN0aXZlcygpXSA8UkJSQUNFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gTGFiZWxlZCBTdGF0ZW1lbnQgKG1hcHMgdG8gbGl0ZXJhbCBmaWVsZCkNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgTGFiZWxlZFN0YXRlbWVudCAoKToNCi17LypAYmdlbihqanRyZWUpIExhYmVsZWRTdGF0ZW1lbnQgKi8NCi0gIEFTVExhYmVsZWRTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RMYWJlbGVkU3RhdGVtZW50KHRoaXMsIEpKVExBQkVMRURTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExhYmVsZWRTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBJZGVudGlmaWVyKCkgPENPTE9OPiBTdWJzdGF0ZW1lbnQoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gSWYgU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBJZlN0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgSWZTdGF0ZW1lbnQgKi8NCi0gIEFTVElmU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUSWZTdGF0ZW1lbnQodGhpcywgSkpUSUZTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIElmU3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPElGPiA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+IA0KLSAgICAgICAgICAgIFN1YnN0YXRlbWVudCgpIA0KLSAgICAgICAgICAgIFtMT09LQUhFQUQoMSkgPEVMU0U+IFN1YnN0YXRlbWVudCgpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gU3dpdGNoIFN0YXRlbWVudCANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgU3dpdGNoU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU3dpdGNoU3RhdGVtZW50ICovDQotICBBU1RTd2l0Y2hTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTd2l0Y2hTdGF0ZW1lbnQodGhpcywgSkpUU1dJVENIU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTd2l0Y2hTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U1dJVENIPiA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+DQotICAgICAgICAgICAgICAgICA8TEJSQUNFPiBbQ2FzZUVsZW1lbnRzKCldIDxSQlJBQ0U+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBDYXNlRWxlbWVudHMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBDYXNlRWxlbWVudHMgKi8NCi0gIEFTVENhc2VFbGVtZW50cyBqanRuMDAwID0gbmV3IEFTVENhc2VFbGVtZW50cyh0aGlzLCBKSlRDQVNFRUxFTUVOVFMpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENhc2VFbGVtZW50cyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIENhc2VMYWJlbCgpIChDYXNlRWxlbWVudCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIENhc2VFbGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2FzZUVsZW1lbnQgKi8NCi0gIEFTVENhc2VFbGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUVsZW1lbnQodGhpcywgSkpUQ0FTRUVMRU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENhc2VFbGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRGlyZWN0aXZlKCkNCi0gICAgfCAgIENhc2VMYWJlbCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBDYXNlTGFiZWwgKCk6DQotey8qQGJnZW4oamp0cmVlKSBDYXNlTGFiZWwgKi8NCi0gIEFTVENhc2VMYWJlbCBqanRuMDAwID0gbmV3IEFTVENhc2VMYWJlbCh0aGlzLCBKSlRDQVNFTEFCRUwpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENhc2VMYWJlbCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxDQVNFPiBMaXN0RXhwcmVzc2lvbigpIDxDT0xPTj4NCi0gICAgfCAgIDxfREVGQVVMVD4gPENPTE9OPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRG8tV2hpbGUgU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBEb1N0YXRlbWVudCgpOiANCi17LypAYmdlbihqanRyZWUpIERvU3RhdGVtZW50ICovDQotICBBU1REb1N0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVERvU3RhdGVtZW50KHRoaXMsIEpKVERPU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBEb1N0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxETz4gU3Vic3RhdGVtZW50KCkgPFdISUxFPiA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBXaGlsZSBTdGF0ZW1lbnQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgV2hpbGVTdGF0ZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBXaGlsZVN0YXRlbWVudCAqLw0KLSAgQVNUV2hpbGVTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RXaGlsZVN0YXRlbWVudCh0aGlzLCBKSlRXSElMRVNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgV2hpbGVTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8V0hJTEU+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4NCi0gICAgICAgICAgIFN1YnN0YXRlbWVudCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBGb3IgU3RhdGVtZW50cyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRm9yU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRm9yU3RhdGVtZW50ICovDQotICBBU1RGb3JTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RGb3JTdGF0ZW1lbnQodGhpcywgSkpURk9SU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGb3JTdGF0ZW1lbnQgKi8NCi0gICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgIExPT0tBSEVBRCg8Rk9SPiA8TFBBUkVOPiBGb3JJbkJpbmRpbmcoKSA8SU4+KQ0KLSAgICAgICAgICAgICAgICAgICA8Rk9SPiA8TFBBUkVOPiBGb3JJbkJpbmRpbmcoKSA8SU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4NCi0gICAgICAgICAgICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkNCi0gICAgfCAgICAgICAgICAgICAgPEZPUj4gPExQQVJFTj4gW0ZvckluaXRpYWxpemVyKCldIDxTRU1JQ09MT04+IA0KLSAgICAgICAgICAgICAgICAgICAgICAgW0xpc3RFeHByZXNzaW9uKCldIDxTRU1JQ09MT04+IA0KLSAgICAgICAgICAgICAgICAgICAgICAgW0xpc3RFeHByZXNzaW9uKCldIDxSUEFSRU4+IA0KLSAgICAgICAgICAgICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICB9DQotICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEZvckluaXRpYWxpemVyICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRm9ySW5pdGlhbGl6ZXIgKi8NCi0gIEFTVEZvckluaXRpYWxpemVyIGpqdG4wMDAgPSBuZXcgQVNURm9ySW5pdGlhbGl6ZXIodGhpcywgSkpURk9SSU5JVElBTElaRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZvckluaXRpYWxpemVyICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDMpIExpc3RFeHByZXNzaW9uTm9JTigpDQotICAgIHwgICAgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uTm9JTigpDQotICAgIHwgICAgICAgICAgICAgICAgQXR0cmlidXRlcygpICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRm9ySW5CaW5kaW5nICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRm9ySW5CaW5kaW5nICovDQotICBBU1RGb3JJbkJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RGb3JJbkJpbmRpbmcodGhpcywgSkpURk9SSU5CSU5ESU5HKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGb3JJbkJpbmRpbmcgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgUG9zdGZpeEV4cHJlc3Npb24oKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdOb0lOKCkNCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzKCkgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ05vSU4oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gV2l0aCBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFdpdGhTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFdpdGhTdGF0ZW1lbnQgKi8NCi0gIEFTVFdpdGhTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RXaXRoU3RhdGVtZW50KHRoaXMsIEpKVFdJVEhTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFdpdGhTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8V0lUSD4gPExQQVJFTj4gRXhwcmVzc2lvblN0YXRlbWVudCgpIDxSUEFSRU4+DQotICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIENvbnRpbnVlIGFuZCBCcmVhayBTdGF0ZW1lbnQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQ29udGludWVTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIENvbnRpbnVlU3RhdGVtZW50ICovDQotICBBU1RDb250aW51ZVN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVENvbnRpbnVlU3RhdGVtZW50KHRoaXMsIEpKVENPTlRJTlVFU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBDb250aW51ZVN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxDT05USU5VRT4gW0lkZW50aWZpZXIoKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEJyZWFrU3RhdGVtZW50KCk6DQotey8qQGJnZW4oamp0cmVlKSBCcmVha1N0YXRlbWVudCAqLw0KLSAgQVNUQnJlYWtTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RCcmVha1N0YXRlbWVudCh0aGlzLCBKSlRCUkVBS1NUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQnJlYWtTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8QlJFQUs+IFtJZGVudGlmaWVyKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotIA0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUmV0dXJuIFN0YXRlbWVudA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBSZXR1cm5TdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFJldHVyblN0YXRlbWVudCAqLw0KLSAgQVNUUmV0dXJuU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUUmV0dXJuU3RhdGVtZW50KHRoaXMsIEpKVFJFVFVSTlNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmV0dXJuU3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFJFVFVSTj4gW0xpc3RFeHByZXNzaW9uKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBUaHJvdyBTdGF0ZW1lbnQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVGhyb3dTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFRocm93U3RhdGVtZW50ICovDQotICBBU1RUaHJvd1N0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFRocm93U3RhdGVtZW50KHRoaXMsIEpKVFRIUk9XU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBUaHJvd1N0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxUSFJPVz4gTGlzdEV4cHJlc3Npb24oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gVHJ5IFN0YXRlbWVudA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBUcnlTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFRyeVN0YXRlbWVudCAqLw0KLSAgQVNUVHJ5U3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUVHJ5U3RhdGVtZW50KHRoaXMsIEpKVFRSWVNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVHJ5U3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFRSWT4gQmxvY2soKQ0KLSAgICAgICAgKDxDQVRDSD4gPExQQVJFTj4gSWRlbnRpZmllcigpIDxSUEFSRU4+IEJsb2NrKCkpKg0KLSAgICAgICAgWzxGSU5BTExZPiBCbG9jaygpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfSANCi0gDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBEaXJlY3RpdmVzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBEaXJlY3RpdmVzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlcyAqLw0KLSAgQVNURGlyZWN0aXZlcyBqanRuMDAwID0gbmV3IEFTVERpcmVjdGl2ZXModGhpcywgSkpURElSRUNUSVZFUyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlcyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIChEaXJlY3RpdmUoKSkrLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBEaXJlY3RpdmUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBEaXJlY3RpdmUgKi8NCi0gIEFTVERpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVERpcmVjdGl2ZSh0aGlzLCBKSlRESVJFQ1RJVkUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIERpcmVjdGl2ZSAqLw0KLSAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgICAgICAgICAgICAgICBFbXB0eVN0YXRlbWVudCgpDQotICAgICB8ICAgTE9PS0FIRUFEKDMpIFN0YXRlbWVudCgpDQotICAgICB8ICAgTE9PS0FIRUFEKDIpIEFubm90YXRhYmxlRGlyZWN0aXZlKCkNCi0gICAgIHwgICBMT09LQUhFQUQoMikgQXR0cmlidXRlcygpICAgICAgICAgICAgPExCUkFDRT4gRGlyZWN0aXZlcygpIDxSQlJBQ0U+DQotICAgICB8ICAgTE9PS0FIRUFEKDIpIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgIEFubm90YXRhYmxlRGlyZWN0aXZlKCkgDQotICAgICB8ICAgICAgICAgICAgICAgIEluY2x1ZGVEaXJlY3RpdmUoKSAgICAgIFNjKCkNCi0gICAgIHwgICAgICAgICAgICAgICAgUHJhZ21hKCkgICAgICAgICAgICAgICAgU2MoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBbm5vdGF0YWJsZURpcmVjdGl2ZSAoKToNCi17LypAYmdlbihqanRyZWUpIEFubm90YXRhYmxlRGlyZWN0aXZlICovDQotICBBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEFubm90YXRhYmxlRGlyZWN0aXZlKHRoaXMsIEpKVEFOTk9UQVRBQkxFRElSRUNUSVZFKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBbm5vdGF0YWJsZURpcmVjdGl2ZSAqLw0KLSAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uKCkgU2MoKQ0KLSAgICAgfCAgIEZ1bmN0aW9uRGVmaW5pdGlvbigpDQotICAgICB8ICAgQ2xhc3NEZWZpbml0aW9uKCkNCi0gICAgIHwgICBJbnRlcmZhY2VEZWZpbml0aW9uKCkNCi0gICAgIHwgICBOYW1lc3BhY2VEZWZpbml0aW9uKCkgU2MoKQ0KLSAgICAgfCAgIEltcG9ydERpcmVjdGl2ZSgpIFNjKCkNCi0gICAgIHwgICBFeHBvcnREZWZpbml0aW9uKCkgU2MoKQ0KLSAgICAgfCAgIFVzZURpcmVjdGl2ZSgpIFNjKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgICB9DQotICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICB9DQotICAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBBdHRyaWJ1dGVzDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEF0dHJpYnV0ZXMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGVzICovDQotICBBU1RBdHRyaWJ1dGVzIGpqdG4wMDAgPSBuZXcgQVNUQXR0cmlidXRlcyh0aGlzLCBKSlRBVFRSSUJVVEVTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGVzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKEF0dHJpYnV0ZSAoKSkrLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBdHRyaWJ1dGUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGUgKi8NCi0gIEFTVEF0dHJpYnV0ZSBqanRuMDAwID0gbmV3IEFTVEF0dHJpYnV0ZSh0aGlzLCBKSlRBVFRSSUJVVEUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZSAqLw0KLSAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXhwcmVzc2lvbigpDQotICAgIHwgICAgICAgICAgICAgICAgPFRSVUU+DQotICAgIHwgICAgICAgICAgICAgICAgPEZBTFNFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFVzZSBEaXJlY3RpdmUNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVXNlRGlyZWN0aXZlICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVXNlRGlyZWN0aXZlICovDQotICBBU1RVc2VEaXJlY3RpdmUgamp0bjAwMCA9IG5ldyBBU1RVc2VEaXJlY3RpdmUodGhpcywgSkpUVVNFRElSRUNUSVZFKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBVc2VEaXJlY3RpdmUgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovIA0KLSAgICAgICAgPFVTRT4gPE5BTUVTUEFDRT4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gSW1wb3J0IERpcmVjdGl2ZQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBJbXBvcnREaXJlY3RpdmUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBJbXBvcnREaXJlY3RpdmUgKi8NCi0gIEFTVEltcG9ydERpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEltcG9ydERpcmVjdGl2ZSh0aGlzLCBKSlRJTVBPUlRESVJFQ1RJVkUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEltcG9ydERpcmVjdGl2ZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgzKSA8SU1QT1JUPiBQYWNrYWdlTmFtZSgpDQotICAgIHwgICAgICAgICAgICAgICAgPElNUE9SVD4gSWRlbnRpZmllcigpIDxBU1NJR04+IFBhY2thZ2VOYW1lKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEluY2x1ZGUgRGlyZWN0aXZlDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEluY2x1ZGVEaXJlY3RpdmUgKCk6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgSW5jbHVkZURpcmVjdGl2ZSAqLw0KLSAgQVNUSW5jbHVkZURpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEluY2x1ZGVEaXJlY3RpdmUodGhpcywgSkpUSU5DTFVERURJUkVDVElWRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgSW5jbHVkZURpcmVjdGl2ZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxJTkNMVURFPiA8U1RSSU5HX0xJVEVSQUw+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUHJhZ21hDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFByYWdtYSAoKToNCi17LypAYmdlbihqanRyZWUpIFByYWdtYSAqLw0KLSAgQVNUUHJhZ21hIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hKHRoaXMsIEpKVFBSQUdNQSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFVTRT4gUHJhZ21hSXRlbXMoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUHJhZ21hSXRlbXMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFJdGVtcyAqLw0KLSAgQVNUUHJhZ21hSXRlbXMgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFJdGVtcyh0aGlzLCBKSlRQUkFHTUFJVEVNUyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hSXRlbXMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBQcmFnbWFJdGVtKCkgKDxDT01NQT4gUHJhZ21hSXRlbSgpKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUHJhZ21hSXRlbSAoKToNCi17LypAYmdlbihqanRyZWUpIFByYWdtYUl0ZW0gKi8NCi0gIEFTVFByYWdtYUl0ZW0gamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFJdGVtKHRoaXMsIEpKVFBSQUdNQUlURU0pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFByYWdtYUl0ZW0gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBQcmFnbWFFeHByKCkgWzxIT09LPl0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIFByYWdtYUV4cHIgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFFeHByICovDQotICBBU1RQcmFnbWFFeHByIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hRXhwcih0aGlzLCBKSlRQUkFHTUFFWFBSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFFeHByICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgSWRlbnRpZmllcigpIFs8TFBBUkVOPiBQcmFnbWFBcmd1bWVudCgpIDxSUEFSRU4+XS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUHJhZ21hQXJndW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFBcmd1bWVudCAqLw0KLSAgQVNUUHJhZ21hQXJndW1lbnQgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFBcmd1bWVudCh0aGlzLCBKSlRQUkFHTUFBUkdVTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hQXJndW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8VFJVRT4NCi0gICAgfCAgIDxGQUxTRT4NCi0gICAgfCAgIDxERUNJTUFMX0xJVEVSQUw+IA0KLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+DQotICAgIHwgICA8SEVYX0xJVEVSQUw+DQotICAgIHwgICA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gDQotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovIA0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIERlZmluaXRpb25zIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFeHBvcnQgRGVmaW5pdGlvbiANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRXhwb3J0RGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIEV4cG9ydERlZmluaXRpb24gKi8NCi0gIEFTVEV4cG9ydERlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RFeHBvcnREZWZpbml0aW9uKHRoaXMsIEpKVEVYUE9SVERFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cG9ydERlZmluaXRpb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8RVhQT1JUPiBFeHBvcnRCaW5kaW5nTGlzdCAoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRXhwb3J0QmluZGluZ0xpc3QgKCk6DQotey8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nTGlzdCAqLw0KLSAgQVNURXhwb3J0QmluZGluZ0xpc3Qgamp0bjAwMCA9IG5ldyBBU1RFeHBvcnRCaW5kaW5nTGlzdCh0aGlzLCBKSlRFWFBPUlRCSU5ESU5HTElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwb3J0QmluZGluZ0xpc3QgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBFeHBvcnRCaW5kaW5nKCkgKDxDT01NQT4gRXhwb3J0QmluZGluZygpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEV4cG9ydEJpbmRpbmcgKCk6DQotey8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nICovDQotICBBU1RFeHBvcnRCaW5kaW5nIGpqdG4wMDAgPSBuZXcgQVNURXhwb3J0QmluZGluZyh0aGlzLCBKSlRFWFBPUlRCSU5ESU5HKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDIpIEZ1bmN0aW9uTmFtZSAoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSAoKSA8QVNTSUdOPiBGdW5jdGlvbk5hbWUgKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFZhcmlhYmxlIERlZmluaXRpb24gKGluLCBOb0lOKQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBWYXJpYWJsZURlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb24gKi8NCi0gIEFTVFZhcmlhYmxlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzLCBKSlRWQVJJQUJMRURFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdMaXN0KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25Ob0lOICovDQotICBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTih0aGlzLCBKSlRWQVJJQUJMRURFRklOSVRJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25LaW5kICovDQotICBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZCh0aGlzLCBKSlRWQVJJQUJMRURFRklOSVRJT05LSU5EKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25LaW5kICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFZBUj4NCi0gICAgfCAgIDxDT05TVD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTGlzdCAqLw0KLSAgQVNUVmFyaWFibGVCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3QodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTGlzdCAqLw0KLSAgIHRyeSB7DQotLypAZWdlbiovDQotICAgVmFyaWFibGVCaW5kaW5nKCkgKDxDT01NQT4gVmFyaWFibGVCaW5kaW5nICgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgIH0gZWxzZSB7DQotICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICB9DQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgIH0NCi0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICB9DQotICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICB9IGZpbmFsbHkgew0KLSAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgfQ0KLSAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOICovDQotICBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKHRoaXMsIEpKVFZBUklBQkxFQklORElOR0xJU1ROT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAqLw0KLSAgIHRyeSB7DQotLypAZWdlbiovDQotICAgVmFyaWFibGVCaW5kaW5nTm9JTigpICg8Q09NTUE+IFZhcmlhYmxlQmluZGluZ05vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICB9IGVsc2Ugew0KLSAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgfQ0KLSAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICB9DQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgfQ0KLSAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgfSBmaW5hbGx5IHsNCi0gICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgIH0NCi0gICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFyaWFibGVCaW5kaW5nICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nICovDQotICBBU1RWYXJpYWJsZUJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUJpbmRpbmcodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmcgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBUeXBlZElkZW50aWZpZXIoKSBbVmFyaWFibGVJbml0aWFsaXNhdGlvbigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFyaWFibGVCaW5kaW5nTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ05vSU4gKi8NCi0gIEFTVFZhcmlhYmxlQmluZGluZ05vSU4gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUJpbmRpbmdOb0lOKHRoaXMsIEpKVFZBUklBQkxFQklORElOR05PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ05vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBUeXBlZElkZW50aWZpZXJOb0lOKCkgW1ZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotDQotdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXNhdGlvbiAqLw0KLSAgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24odGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXNhdGlvbiAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplciAoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOICovDQotICBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElTQVRJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgfQ0KLSAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFyaWFibGVJbml0aWFsaXplciAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKi8NCi0gIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIgamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUluaXRpYWxpemVyKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElaRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgQXNzaWdubWVudEV4cHJlc3Npb24gKCkNCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOICovDQotICBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElaRVJOT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgzKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKCkNCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotDQotdm9pZCBUeXBlZElkZW50aWZpZXIgKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXIgKi8NCi0gIEFTVFR5cGVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVFR5cGVkSWRlbnRpZmllcih0aGlzLCBKSlRUWVBFRElERU5USUZJRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFR5cGVkSWRlbnRpZmllciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIElkZW50aWZpZXIgKCkgWzxDT0xPTj4gVHlwZUV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFR5cGVkSWRlbnRpZmllck5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXJOb0lOICovDQotICBBU1RUeXBlZElkZW50aWZpZXJOb0lOIGpqdG4wMDAgPSBuZXcgQVNUVHlwZWRJZGVudGlmaWVyTm9JTih0aGlzLCBKSlRUWVBFRElERU5USUZJRVJOT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXJOb0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgSWRlbnRpZmllciAoKSBbPENPTE9OPiBUeXBlRXhwcmVzc2lvbk5vSU4oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFNpbXBsZSBWYXJpYWJsZSBEZWZpbml0aW9uIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gKi8NCi0gIEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbih0aGlzLCBKSlRTSU1QTEVWQVJJQUJMRURFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxWQVI+IFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QgKi8NCi0gIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0IGpqdG4wMDAgPSBuZXcgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QodGhpcywgSkpUVU5UWVBFRFZBUklBQkxFQklORElOR0xJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVW50eXBlZFZhcmlhYmxlQmluZGluZygpICg8Q09NTUE+IFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBVbnR5cGVkVmFyaWFibGVCaW5kaW5nICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZyAqLw0KLSAgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyBqanRuMDAwID0gbmV3IEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcodGhpcywgSkpUVU5UWVBFRFZBUklBQkxFQklORElORyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIElkZW50aWZpZXIoKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEZ1bmN0aW9uIERlZmluaXRpb24NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRnVuY3Rpb25EZWZpbml0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25EZWZpbml0aW9uICovDQotICBBU1RGdW5jdGlvbkRlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkRlZmluaXRpb24odGhpcywgSkpURlVOQ1RJT05ERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkRlZmluaXRpb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8RlVOQ1RJT04+IEZ1bmN0aW9uTmFtZSgpIEZ1bmN0aW9uQ29tbW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEZ1bmN0aW9uTmFtZSAoKToNCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uTmFtZSAqLw0KLSAgQVNURnVuY3Rpb25OYW1lIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25OYW1lKHRoaXMsIEpKVEZVTkNUSU9OTkFNRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25OYW1lICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgLy8gbm8gbGluZSBicmVhayBhZnRlciBnZXQNCi0gICAgICAgIExPT0tBSEVBRCgyKSA8R0VUPiBJZGVudGlmaWVyKCkNCi0gICAgICAgIC8vIG5vIGxpbmUgYnJlYWsgYWZ0ZXIgZ2V0DQotICAgIHwgICBMT09LQUhFQUQoMikgPFNFVD4gSWRlbnRpZmllcigpDQotICAgIHwgICAgICAgICAgICAgICAgIElkZW50aWZpZXIoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25Db21tb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbW1vbiAqLw0KLSAgQVNURnVuY3Rpb25Db21tb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkNvbW1vbih0aGlzLCBKSlRGVU5DVElPTkNPTU1PTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25Db21tb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TFBBUkVOPiBbUGFyYW1ldGVycygpXSA8UlBBUkVOPiBbUmVzdWx0KCldIEJsb2NrKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFBhcmFtZXRlcnMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJzICovDQotICBBU1RQYXJhbWV0ZXJzIGpqdG4wMDAgPSBuZXcgQVNUUGFyYW1ldGVycyh0aGlzLCBKSlRQQVJBTUVURVJTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUmVzdFBhcmFtZXRlcnMoKQ0KLSAgICB8ICAgUGFyYW1ldGVySW5pdCgpICg8Q09NTUE+IFBhcmFtZXRlckluaXQoKSkqIFtSZXN0UGFyYW1ldGVycygpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFyYW1ldGVyICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUGFyYW1ldGVyICovDQotICBBU1RQYXJhbWV0ZXIgamp0bjAwMCA9IG5ldyBBU1RQYXJhbWV0ZXIodGhpcywgSkpUUEFSQU1FVEVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXIgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBbPENPTlNUPl0gVHlwZWRJZGVudGlmaWVyKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFBhcmFtZXRlckluaXQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJJbml0ICovDQotICBBU1RQYXJhbWV0ZXJJbml0IGpqdG4wMDAgPSBuZXcgQVNUUGFyYW1ldGVySW5pdCh0aGlzLCBKSlRQQVJBTUVURVJJTklUKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJJbml0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUGFyYW1ldGVyKCkgWzxBU1NJR04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBSZXN0UGFyYW1ldGVycyAoKToNCi17LypAYmdlbihqanRyZWUpIFJlc3RQYXJhbWV0ZXJzICovDQotICBBU1RSZXN0UGFyYW1ldGVycyBqanRuMDAwID0gbmV3IEFTVFJlc3RQYXJhbWV0ZXJzKHRoaXMsIEpKVFJFU1RQQVJBTUVURVJTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBSZXN0UGFyYW1ldGVycyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxFTElQU0U+IFs8Q09OU1Q+IElkZW50aWZpZXIoKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlc3VsdCAoKToNCi17LypAYmdlbihqanRyZWUpIFJlc3VsdCAqLw0KLSAgQVNUUmVzdWx0IGpqdG4wMDAgPSBuZXcgQVNUUmVzdWx0KHRoaXMsIEpKVFJFU1VMVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVzdWx0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPENPTE9OPiBUeXBlRXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBDbGFzcyBEZWZpbml0aW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIENsYXNzRGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIENsYXNzRGVmaW5pdGlvbiAqLw0KLSAgQVNUQ2xhc3NEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUQ2xhc3NEZWZpbml0aW9uKHRoaXMsIEpKVENMQVNTREVGSU5JVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2xhc3NEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPENMQVNTPiBJZGVudGlmaWVyKCkgW0luaGVyaXRhbmNlKCldIEJsb2NrKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEludGVyZmFjZURlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBJbnRlcmZhY2VEZWZpbml0aW9uICovDQotICBBU1RJbnRlcmZhY2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbih0aGlzLCBKSlRJTlRFUkZBQ0VERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBJbnRlcmZhY2VEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDMpIDxJTlRFUkZBQ0U+IElkZW50aWZpZXIoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgPElOVEVSRkFDRT4gSWRlbnRpZmllcigpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs8RVhURU5EUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldIEJsb2NrKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIEluaGVyaXRhbmNlICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgSW5oZXJpdGFuY2UgKi8NCi0gIEFTVEluaGVyaXRhbmNlIGpqdG4wMDAgPSBuZXcgQVNUSW5oZXJpdGFuY2UodGhpcywgSkpUSU5IRVJJVEFOQ0UpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEluaGVyaXRhbmNlICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLyANCi0gICAgICAgIDxFWFRFTkRTPiBUeXBlRXhwcmVzc2lvbigpIFs8SU1QTEVNRU5UUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldDQotICAgIHwgICA8SU1QTEVNRU5UUz4gVHlwZUV4cHJlc3Npb25MaXN0KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIE5hbWVzcGFjZSBEZWZpbml0aW9uIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBOYW1lc3BhY2VEZWZpbml0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTmFtZXNwYWNlRGVmaW5pdGlvbiAqLw0KLSAgQVNUTmFtZXNwYWNlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVE5hbWVzcGFjZURlZmluaXRpb24odGhpcywgSkpUTkFNRVNQQUNFREVGSU5JVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTmFtZXNwYWNlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxOQU1FU1BBQ0U+IElkZW50aWZpZXIoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUGFja2FnZSBEZWZpbml0aW9uIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBQYWNrYWdlRGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFBhY2thZ2VEZWZpbml0aW9uICovDQotICBBU1RQYWNrYWdlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVFBhY2thZ2VEZWZpbml0aW9uKHRoaXMsIEpKVFBBQ0tBR0VERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxQQUNLQUdFPiBbUGFja2FnZU5hbWUoKV0gQmxvY2soKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFja2FnZU5hbWUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlTmFtZSAqLw0KLSAgQVNUUGFja2FnZU5hbWUgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlTmFtZSh0aGlzLCBKSlRQQUNLQUdFTkFNRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZU5hbWUgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U1RSSU5HX0xJVEVSQUw+DQotICAgIHwgICBQYWNrYWdlSWRlbnRpZmllcnMoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFja2FnZUlkZW50aWZpZXJzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZUlkZW50aWZpZXJzICovDQotICBBU1RQYWNrYWdlSWRlbnRpZmllcnMgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlSWRlbnRpZmllcnModGhpcywgSkpUUEFDS0FHRUlERU5USUZJRVJTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlSWRlbnRpZmllcnMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBJZGVudGlmaWVyKCkgKDxET1Q+IElkZW50aWZpZXIoKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamp0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamp0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAzNWJjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL2pzMi4wLmpqdAorKysgL2Rldi9udWxsCkBAIC0xLDE1MDEgKzAsMCBAQAotb3B0aW9ucyB7Ci0gICAgU1RBVElDPWZhbHNlOwotICAgIE1VTFRJPXRydWU7Ci0gICAgVklTSVRPUj10cnVlOwotICAgIE5PREVfVVNFU19QQVJTRVI9dHJ1ZTsKLSAgICBERUJVR19UT0tFTl9NQU5BR0VSPWZhbHNlOwotICAgIERFQlVHX1BBUlNFUj1mYWxzZTsKLX0KLQotUEFSU0VSX0JFR0lOKEpTUGFyc2VyMjApCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLXB1YmxpYyBjbGFzcyBKU1BhcnNlcjIwIAotewotICAgIC8vCi0gICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBub2RlIGZvciB0aGUgcGFyc2UgdHJlZSAocm9vdCBET00gbm9kZSwgdHJlZSBvZiBTaW1wbGVOb2RlKHMpKQotICAgIC8vCi0gICAgcHJvdGVjdGVkIEFTVFByb2dyYW0gX2pqdFJvb3Q7Ci0gICAgCi0gICAgcHVibGljIEFTVFByb2dyYW0gZ2V0Um9vdE5vZGUoKQotICAgIHsKLSAgICAJcmV0dXJuIF9qanRSb290OwotICAgIH0KLSAgICAKLX0KLQotUEFSU0VSX0VORChKU1BhcnNlcjIwKQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExFWElDQUwgUlVMRVMgU2VjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOX01HUl9ERUNMUyA6Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIHB1YmxpYyB2b2lkIHNldFJlZ0ludmFsaWQoKQotICAgIHsKLSAgICAgICAgaXNSZWdWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdWYWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBXSElURSBTUEFDRSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgICAgICAgPEVPTDogICAoWyJcbiIsIlxyIl0pKyA+Ci0gICAgfCAgIDxXUzogICAgKFsiICIsIlx0Il0pKyA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ09NTUVOVFMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotTU9SRSA6Ci17Ci0gICAgICAgICIvLyIgOiBJTl9TSU5HTEVfTElORV9DT01NRU5UCi0gICAgfCAgICIvKiIgOiBJTl9NVUxUSV9MSU5FX0NPTU1FTlQKLX0KLQotPElOX1NJTkdMRV9MSU5FX0NPTU1FTlQ+Ci1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgICAgICAgPCBTSU5HTEVfTElORV9DT01NRU5UOiAoflsiXG4iLCJcciJdKSogKCJcbiJ8IlxyInwiXHJcbiIpPyA+ICA6IERFRkFVTFQKLX0KLQotPElOX01VTFRJX0xJTkVfQ09NTUVOVD4KLVNQRUNJQUxfVE9LRU4gOgotewotICAgICAgICA8TVVMVElfTElORV9DT01NRU5UOiAiKi8iID4gOiBERUZBVUxUCi19Ci0KLTxJTl9TSU5HTEVfTElORV9DT01NRU5ULCBJTl9NVUxUSV9MSU5FX0NPTU1FTlQ+Ci1NT1JFIDoKLXsKLSAgICAgICAgPCB+W10gPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJFU0VSVkVEIFdPUkRTIEFORCBMSVRFUkFMUwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBBUzogICAgICAgICAgICJhcyIgICAgICAgICA+Ci0gICAgfCAgIDwgQlJFQUs6ICAgICAgICAiYnJlYWsiICAgICAgPgotICAgIHwgICA8IENBU0U6ICAgICAgICAgImNhc2UiICAgICAgID4KLSAgICB8ICAgPCBDQVRDSDogICAgICAgICJjYXRjaCIgICAgICA+Ci0gICAgfCAgIDwgQ0xBU1M6ICAgICAgICAiY2xhc3MiICAgICAgPgotICAgIHwgICA8IENPTlNUOiAgICAgICAgImNvbnN0IiAgICAgID4KLSAgICB8ICAgPCBDT05USU5VRTogICAgICJjb250aW51ZSIgICA+Ci0gICAgfCAgIDwgX0RFRkFVTFQ6ICAgICAiZGVmYXVsdCIgICAgPgotICAgIHwgICA8IERFTEVURTogICAgICAgImRlbGV0ZSIgICAgID4KLSAgICB8ICAgPCBETzogICAgICAgICAgICJkbyIgICAgICAgICA+Ci0gICAgfCAgIDwgRUxTRTogICAgICAgICAiZWxzZSIgICAgICAgPgotICAgIHwgICA8IEVYVEVORFM6ICAgICAgImV4dGVuZHMiICAgID4KLSAgICB8ICAgPCBGQUxTRTogICAgICAgICJmYWxzZSIgICAgICA+ICAgCi0gICAgfCAgIDwgRklOQUxMWTogICAgICAiZmluYWxseSIgICAgPgotICAgIHwgICA8IEZPUjogICAgICAgICAgImZvciIgICAgICAgID4KLSAgICB8ICAgPCBGVU5DVElPTjogICAgICJmdW5jdGlvbiIgICA+Ci0gICAgfCAgIDwgRlVOQ1RJT05fOiAgICAiRnVuY3Rpb24iICAgPgotICAgIHwgICA8IEdFVDogICAgICAgICAgImdldCIgICAgICAgID4KLSAgICB8ICAgPCBJRjogICAgICAgICAgICJpZiIgICAgICAgICA+Ci0gICAgfCAgIDwgSU46ICAgICAgICAgICAiaW4iICAgICAgICAgPgotICAgIHwgICA8IElOQ0xVREU6ICAgICAgImluY2x1ZGUiICAgID4KLSAgICB8ICAgPCBJTlNUQU5DRU9GOiAgICJpbnN0YW5jZW9mIiA+Ci0gICAgfCAgIDwgSVM6ICAgICAgICAgICAiaXMiICAgICAgICAgPgotICAgIHwgICA8IE5BTUVTUEFDRTogICAgIm5hbWVzcGFjZSIgID4KLSAgICB8ICAgPCBORVc6ICAgICAgICAgICJuZXciICAgICAgICA+Ci0gICAgfCAgIDwgTlVMTDogICAgICAgICAibnVsbCIgICAgICAgPiAgICAKLSAgICB8ICAgPCBQQUNLQUdFOiAgICAgICJwYWNrYWdlIiAgICA+IAotICAgIHwgICA8IFBSSVZBVEU6ICAgICAgInByaXZhdGUiICAgID4KLSAgICB8ICAgPCBQVUJMSUM6ICAgICAgICJwdWJsaWMiICAgICA+Ci0gICAgfCAgIDwgUkVUVVJOOiAgICAgICAicmV0dXJuIiAgICAgPgotICAgIHwgICA8IFNFVDogICAgICAgICAgInNldCIgICAgICAgID4KLSAgICB8ICAgPCBTVVBFUjogICAgICAgICJzdXBlciIgICAgICA+Ci0gICAgfCAgIDwgU1dJVENIOiAgICAgICAic3dpdGNoIiAgICAgPgotICAgIHwgICA8IFRISVM6ICAgICAgICAgInRoaXMiICAgICAgID4KLSAgICB8ICAgPCBUSFJPVzogICAgICAgICJ0aHJvdyIgICAgICA+Ci0gICAgfCAgIDwgVFJVRTogICAgICAgICAidHJ1ZSIgICAgICAgPiAKLSAgICB8ICAgPCBUUlk6ICAgICAgICAgICJ0cnkiICAgICAgICA+Ci0gICAgfCAgIDwgVFlQRU9GOiAgICAgICAidHlwZW9mIiAgICAgPgotICAgIHwgICA8IFVTRTogICAgICAgICAgInVzZSIgICAgICAgID4KLSAgICB8ICAgPCBWQVI6ICAgICAgICAgICJ2YXIiICAgICAgICA+Ci0gICAgfCAgIDwgVk9JRDogICAgICAgICAidm9pZCIgICAgICAgPgotICAgIHwgICA8IFdISUxFOiAgICAgICAgIndoaWxlIiAgICAgID4KLSAgICB8ICAgPCBXSVRIOiAgICAgICAgICJ3aXRoIiAgICAgICA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRlVUVVJFIFJFU0VSVkVEIFdPUkRTCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IEFCU1RSQUNUOiAgICAgImFic3RyYWN0IiAgICAgPgotICAgIHwgICA8IERFQlVHR0VSOiAgICAgImRlYnVnZ2VyIiAgICAgPgotICAgIHwgICA8IEVOVU06ICAgICAgICAgImVudW0iICAgICAgICAgPgotICAgIHwgICA8IEVYUE9SVDogICAgICAgImV4cG9ydCIgICAgICAgPgotICAgIHwgICA8IEdPVE86ICAgICAgICAgImdvdG8iICAgICAgICAgPgotICAgIHwgICA8IElNUExFTUVOVFM6ICAgImltcGxlbWVudHMiICAgPgotICAgIHwgICA8IElOVEVSRkFDRTogICAgImludGVyZmFjZSIgICAgPgotICAgIHwgICA8IE5BVElWRTogICAgICAgIm5hdGl2ZSIgICAgICAgPgotICAgIHwgICA8IFBST1RFQ1RFRDogICAgInByb3RlY3RlZCIgICAgPgotICAgIHwgICA8IFNZTkNIUk9OSVpFRDogInN5bmNocm9uaXplZCIgPgotICAgIHwgICA8IFRIUk9XUzogICAgICAgInRocm93cyIgICAgICAgPgotICAgIHwgICA8IFRSQU5TSUVOVDogICAgInRyYW5zaWVudCIgICAgPgotICAgIHwgICA8IFZPTEFUSUxFOiAgICAgInZvbGF0aWxlIiAgICAgPgotICAgIHwgICA8IElNUE9SVDogICAgICAgImltcG9ydCIgICAgICAgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExJVEVSQUxTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBERUNJTUFMX0xJVEVSQUw6IFsiMSItIjkiXSAoWyIwIi0iOSJdKSogPgotICAgIHwgICA8IEhFWF9MSVRFUkFMOiAiMCIgWyJ4IiwiWCJdIChbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdKSsgPgotICAgIHwgICA8IE9DVEFMX0xJVEVSQUw6ICIwIiAoWyIwIi0iNyJdKSogPgotICAgIHwgICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6IChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPyAKLSAgICAgICAgPgotICAgIHwgICA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPgotICAgIHwgICA8IFNUUklOR19MSVRFUkFMOiAgICJcIiIgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0pIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJcIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCJcXCJdKSB8ICJcXCIgKCJcbiIgfCAiXHIiIHwgIlxyXG4iKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgIAotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIgotICAgICAgICA+Ci0gICAgfCAgIDwgI0VTQ0FQRV9TRVFVRU5DRTogCi0gICAgICAgICAgICAiXFwiCi0gICAgICAgICAgICAoICAgICAgIFsibiIsInQiLCJiIiwiciIsImYiLCJcXCIsIiciLCJcIiIsIlsiLCJdIl0KLSAgICAgICAgICAgICAgICB8ICAgWyIwIi0iNyJdICggWyIwIi0iNyJdICk/Ci0gICAgICAgICAgICAgICAgfCAgIFsiMCItIjMiXSBbIjAiLSI3Il0gWyIwIi0iNyJdCi0gICAgICAgICAgICAgICAgfCAgIFsieCJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXQotICAgICAgICAgICAgICAgIHwgICBbInUiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXQotICAgICAgICAgICAgKQotICAgICAgICA+Ci0gICAgfCAgIDwgVU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMOgotICAgICAgICAgICAgICAgICJcIiIgKCAoflsiXCIiLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKiAoIFsiXG4iLCJcciJdICk/Ci0gICAgICAgICAgICB8ICAgIiciICAoICh+WyInIiwiXFwiLCJcbiIsIlxyIl0pICB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqICggWyJcbiIsIlxyIl0gKT8KLSAgICAgICAgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJFR1VMQVIgRVhQUkVTU0lPTlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgoteyAKLSAgICAgICAgPCAjUkVHWF9TVEFSVF9DSEFSIDogflsiXHIiLCJcbiIsIi8iLCI9IiwiKiJdIHwgIlxcLyI+Ci0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTiA6IH5bIlxyIiwiXG4iLCIvIl0gPiAgCi0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSIDogKCA8UkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OPiB8ICJcXC8iICkgPgotICAgIHwgICA8ICNSRUdFWF9FTkRfQ0hBUiA6ICAgICAiaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ2kiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ20iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaWdtIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImltZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbWkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ2ltIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1pZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtZ2kiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA+Ci19Ci0KLVRPS0VOIDoKLXsKLSAgICAgICAgPFJFR1VMQVJfRVhQUkVTU0lPTiA6ICIvIiA8UkVHWF9TVEFSVF9DSEFSPiAoPFJFR1hfQk9EWV9DSEFSPikqICIvIiAgKDxSRUdFWF9FTkRfQ0hBUj4pPyA+Ci0gICAgICAgIHsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBQZWVrIGF0IHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOwotICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVnVmFsaWQgPT0gZmFsc2UgfHwgbmV4dENoID09ICcvJyB8fCBuZXh0Q2ggPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIExleGVjYWwgYW5hbHlzZXIgdGhpbmtzIGl0IGlzIGEgUkUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0b3Igc3VjaCBhcyAvLi4uLi4vCi0gICAgICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgZXZlcnl0aGluZyB0byB0aGUgZmlyc3QgIi8iIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGxlbmd0aE9mTWF0Y2gtMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEFuZCByZW1vdmUgaXQgZnJvbSB0aGUgdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmltYWdlID0gbWF0Y2hlZFRva2VuLmltYWdlLnN1YnN0cmluZygwLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZGVsZXRlKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4ua2luZD1TTEFTSDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgfQotICAgICAgIH0gICAgICAgIAotICAgICAgICAKLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJREVOVElGSUVSUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgSURFTlRJRklFUjogPExFVFRFUj4gKDxMRVRURVI+fDxESUdJVD4pKiA+Ci0gICAgfCAgIDwgI0xFVFRFUjogWyJhIi0ieiIsIkEiLSJaIiwiJCIsIl8iXSA+Ci0gICAgfCAgIDwgI0RJR0lUOiBbIjAiLSI5Il0+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU0VQQVJBVE9SUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgTFBBUkVOOiAgICAiKCIgICA+Ci0gICAgfCAgIDwgUlBBUkVOOiAgICAiKSIgICA+Ci0gICAgfCAgIDwgTEJSQUNFOiAgICAieyIgICA+Ci0gICAgfCAgIDwgUkJSQUNFOiAgICAifSIgICA+Ci0gICAgfCAgIDwgTEJSQUNLRVQ6ICAiWyIgICA+Ci0gICAgfCAgIDwgUkJSQUNLRVQ6ICAiXSIgICA+Ci0gICAgfCAgIDwgU0VNSUNPTE9OOiAiOyIgICA+Ci0gICAgfCAgIDwgQ09NTUE6ICAgICAiLCIgICA+Ci0gICAgfCAgIDwgRE9UOiAgICAgICAiLiIgICA+Ci0gICAgfCAgIDwgUVVBTElGSUVSOiAiOjoiICA+Ci0gICAgfCAgIDwgRUxJUFNFOiAgICAiLi4uIiA+Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBPUEVSQVRPUlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IEFTU0lHTjogICAgICAgICAgICAgICAiPSIgICAgPgotICAgIHwgICA8IEdUOiAgICAgICAgICAgICAgICAgICAiPiIgICAgPgotICAgIHwgICA8IExUOiAgICAgICAgICAgICAgICAgICAiPCIgICAgPgotICAgIHwgICA8IEJBTkc6ICAgICAgICAgICAgICAgICAiISIgICAgPgotICAgIHwgICA8IFRJTERFOiAgICAgICAgICAgICAgICAifiIgICAgPgotICAgIHwgICA8IEhPT0s6ICAgICAgICAgICAgICAgICAiPyIgICAgPgotICAgIHwgICA8IENPTE9OOiAgICAgICAgICAgICAgICAiOiIgICAgPgotICAgIHwgICA8IEVROiAgICAgICAgICAgICAgICAgICAiPT0iICAgPgotICAgIHwgICA8IExFOiAgICAgICAgICAgICAgICAgICAiPD0iICAgPgotICAgIHwgICA8IEdFOiAgICAgICAgICAgICAgICAgICAiPj0iICAgPgotICAgIHwgICA8IE5FOiAgICAgICAgICAgICAgICAgICAiIT0iICAgPgotICAgIHwgICA8IFNDX09SOiAgICAgICAgICAgICAgICAifHwiICAgPgotICAgIHwgICA8IFNDX0FORDogICAgICAgICAgICAgICAiJiYiICAgPgotICAgIHwgICA8IFNDX1hPUjogICAgICAgICAgICAgICAiXl4iICAgPgotICAgIHwgICA8IElOQ1I6ICAgICAgICAgICAgICAgICAiKysiICAgPgotICAgIHwgICA8IERFQ1I6ICAgICAgICAgICAgICAgICAiLS0iICAgPgotICAgIHwgICA8IFBMVVM6ICAgICAgICAgICAgICAgICAiKyIgICAgPgotICAgIHwgICA8IE1JTlVTOiAgICAgICAgICAgICAgICAiLSIgICAgPgotICAgIHwgICA8IFNUQVI6ICAgICAgICAgICAgICAgICAiKiIgICAgPgotICAgIHwgICA8IFNMQVNIOiAgICAgICAgICAgICAgICAiLyIgICAgPgotICAgIHwgICA8IEJJVF9BTkQ6ICAgICAgICAgICAgICAiJiIgICAgPgotICAgIHwgICA8IEJJVF9PUjogICAgICAgICAgICAgICAifCIgICAgPgotICAgIHwgICA8IFhPUjogICAgICAgICAgICAgICAgICAiXiIgICAgPgotICAgIHwgICA8IFJFTTogICAgICAgICAgICAgICAgICAiJSIgICAgPgotICAgIHwgICA8IExTSElGVDogICAgICAgICAgICAgICAiPDwiICAgPgotICAgIHwgICA8IFJTSUdORURTSElGVDogICAgICAgICAiPj4iICAgPgotICAgIHwgICA8IFJVTlNJR05FRFNISUZUOiAgICAgICAiPj4+IiAgPgotICAgIHwgICA8IFBMVVNBU1NJR046ICAgICAgICAgICAiKz0iICAgPgotICAgIHwgICA8IE1JTlVTQVNTSUdOOiAgICAgICAgICAiLT0iICAgPgotICAgIHwgICA8IFNUQVJBU1NJR046ICAgICAgICAgICAiKj0iICAgPgotICAgIHwgICA8IFNMQVNIQVNTSUdOOiAgICAgICAgICAiLz0iICAgPgotICAgIHwgICA8IEFOREFTU0lHTjogICAgICAgICAgICAiJj0iICAgPgotICAgIHwgICA8IE9SQVNTSUdOOiAgICAgICAgICAgICAifD0iICAgPgotICAgIHwgICA8IFhPUkFTU0lHTjogICAgICAgICAgICAiXj0iICAgPgotICAgIHwgICA8IFJFTUFTU0lHTjogICAgICAgICAgICAiJT0iICAgPgotICAgIHwgICA8IExTSElGVEFTU0lHTjogICAgICAgICAiPDw9IiAgPgotICAgIHwgICA8IFJTSUdORURTSElGVEFTU0lHTjogICAiPj49IiAgPgotICAgIHwgICA8IFJVTlNJR05FRFNISUZUQVNTSUdOOiAiPj4+PSIgPgotICAgIHwgICA8IFNDX09SQVNTSUdOOiAgICAgICAgICAifHw9IiAgPgotICAgIHwgICA8IFNDX0FOREFTU0lHTjogICAgICAgICAiJiY9IiAgPgotICAgIHwgICA8IFNDX1hPUkFTU0lHTjogICAgICAgICAiXl49IiAgPgotICAgIHwgICA8IElERU5USVRZT1BFUjogICAgICAgICAiPT09IiAgPgotICAgIHwgICA8IE5PVElERU5USVRZT1BFUjogICAgICAiIT09IiAgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR1JBTU1BUiBTZWN0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVRva2VuIFByb2dyYW0oKToKLXsKLSAgICAgICAgVG9rZW4gcmV0dmFsID0gZ2V0VG9rZW4oMSk7Ci19Ci17Ci0gICAgICAgIChQYWNrYWdlRGVmaW5pdGlvbigpKSogW0RpcmVjdGl2ZXMoKV0gPEVPRj4KLSAgICAgICAgewotICAgICAgICAgICAgX2pqdFJvb3QgPSBqanRUaGlzOwotICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwcmVzc2lvbnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSWRlbnRpZmllciAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIElkZW50aWZpZXIoKToKLXt9Ci17Ci0gICAgICAgIDxJREVOVElGSUVSPgotICAgIHwgICA8R0VUPgotICAgIHwgICA8U0VUPgotICAgIHwgICA8SU5DTFVERT4KLS8vICAgIHwgICA8TkFNRVNQQUNFPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUXVhbGlmaWVkIElkZW50aWZpZXIgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCk6Ci17fQotewotICAgICAgIElkZW50aWZpZXIoKSBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXQotICAgIHwgIFJlc2VydmVkTmFtZXNwYWNlKCkgWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0gCi19Ci0KLXZvaWQgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKToKLXt9Ci17Ci0gICAgICAgPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiA8UVVBTElGSUVSPiBJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBRdWFsaWZpZWRJZGVudGlmaWVyKCk6Ci17fQotewotICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKQotICAgIHwgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByaW1hcnkgRXhwcmVzc2lvbnMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFByaW1hcnlFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAoCi0gICAgICAgIDxOVUxMPgotICAgIHwgICA8VFJVRT4KLSAgICB8ICAgPEZBTFNFPgotICAgIHwgICA8REVDSU1BTF9MSVRFUkFMPiAKLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+Ci0gICAgfCAgIDxIRVhfTElURVJBTD4KLSAgICB8ICAgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IAotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+IAotICAgIHwgICA8VEhJUz4KLSAgICB8ICAgPFJFR1VMQVJfRVhQUkVTU0lPTj4KLSAgICB8ICAgPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotICAgIHwgICBBcnJheUxpdGVyYWwoKQotICAgIHwgICBPYmplY3RMaXRlcmFsKCkKLSAgICB8ICAgRnVuY3Rpb25FeHByZXNzaW9uKCkKLSAgICApCi0gICAgewotICAgICAgICB0b2tlbl9zb3VyY2Uuc2V0UmVnVmFsaWQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVzZXJ2ZWROYW1lc3BhY2UgKCk6Ci17fQotewotICAgICAgIDxQVUJMSUM+Ci0gICAgfCAgPFBST1RFQ1RFRD4KLSAgICB8ICA8UFJJVkFURT4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZ1bmN0aW9uIEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkICBGdW5jdGlvbkV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgPEZVTkNUSU9OPiBGdW5jdGlvbkNvbW1vbigpCi0gICAgfCAgICAgICAgICAgICAgICA8RlVOQ1RJT04+IElkZW50aWZpZXIoKSBGdW5jdGlvbkNvbW1vbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBPYmplY3QgTGl0ZXJhbHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIE9iamVjdExpdGVyYWwgKCk6Ci17fQotewotICAgICAgICA8TEJSQUNFPiBbRmllbGRMaXN0KCldIDxSQlJBQ0U+ICAKLX0gICAgICAgIAotCi12b2lkIEZpZWxkTGlzdCgpOgote30KLXsKLSAgICAgICAgTGl0ZXJhbEZpZWxkKCkgKDxDT01NQT4gTGl0ZXJhbEZpZWxkKCkpKgotfQotCi12b2lkIExpdGVyYWxGaWVsZCAoKToKLXt9Ci17Ci0gICAgICAgIEZpZWxkTmFtZSgpIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKQotfQotCi12b2lkIEZpZWxkTmFtZSAoKToKLXt9Ci17Ci0gICAgICAgIDxTVFJJTkdfTElURVJBTD4KLSAgICB8ICAgPERFQ0lNQUxfTElURVJBTD4KLSAgICB8ICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpCi0gICAgfCAgIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0KLX0JCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBcnJheSBMaXRlcmFsCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBBcnJheUxpdGVyYWwoKToKLXt9Ci17Ci0gICAgICAgIDxMQlJBQ0tFVD4gW0VsZW1lbnRMaXN0KCldIDxSQlJBQ0tFVD4KLX0KLQotdm9pZCBFbGVtZW50TGlzdCgpOgote30KLXsKLSAgICAgICAgTGl0ZXJhbEVsZW1lbnQoKSAoPENPTU1BPiBMaXRlcmFsRWxlbWVudCgpKSoKLX0KLQotdm9pZCBMaXRlcmFsRWxlbWVudCgpOgote30KLXsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU3VwZXIgRXhwcmVzc2lvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgU3VwZXJFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgPFNVUEVSPiBbTE9PS0FIRUFEKDIpIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj5dCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQb3N0Zml4IEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFBvc3RmaXhFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgQXR0cmlidXRlRXhwcmVzc2lvbiAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUG9zdGZpeE9wKCldCi0gICAgfCAgIHt0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpO30gCi0gICAgICAgIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiAoKSAoUHJvcGVydHlPckFyZ3VtZW50cygpKSogW1Bvc3RmaXhPcCgpXQotICAgIHwgICBTdXBlckV4cHJlc3Npb24oKSAgICAgICAgIFByb3BlcnR5T3BlcmF0b3IoKQotfSAgICAKLQotdm9pZCBBdHRyaWJ1dGVFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpICAoUHJvcGVydHlPckFyZ3VtZW50cygpKSoKLX0KLQotdm9pZCBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgIExPT0tBSEVBRCg8TFBBUkVOPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+IDxRVUFMSUZJRVI+KSAKLSAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpCi0gICAgfCAgUHJpbWFyeUV4cHJlc3Npb24oKSAKLSAgICB8ICBGdWxsTmV3RXhwcmVzc2lvbigpICAgICAgICAgICAgIAotfQotCi12b2lkIEZ1bGxOZXdFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgPE5FVz4gRnVsbE5ld1N1YmV4cHJlc3Npb24oKSAgKExPT0tBSEVBRCgyKSBQcm9wZXJ0eU9wZXJhdG9yKCkpKiBbTE9PS0FIRUFEKDIpIEFyZ3VtZW50cygpXQotfQotCi12b2lkIEZ1bmN0aW9uQ29uc3RydWN0b3IoKToKLXt9Ci17ICAgIAotICAgICAgICA8RlVOQ1RJT05fPiBBcmd1bWVudHMoKQotfQotCi12b2lkIEZ1bGxOZXdTdWJleHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gPFFVQUxJRklFUj4pIAotICAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpICAgICAgICAKLSAgICB8ICAgUHJpbWFyeUV4cHJlc3Npb24oKSAKLSAgICB8ICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpCi0gICAgfCAgIFN1cGVyRXhwcmVzc2lvbigpIAotICAgIHwgICBGdWxsTmV3RXhwcmVzc2lvbigpCi0gICAgfCAgIEZ1bmN0aW9uQ29uc3RydWN0b3IoKQotfQotCi0KLXZvaWQgUG9zdGZpeE9wKCk6Ci17fQotewotICAgICAgICA8SU5DUj4KLSAgICB8ICAgPERFQ1I+Ci19Ci0KLXZvaWQgUHJvcGVydHlPckFyZ3VtZW50cyAoKToKLXt9Ci17Ci0gICAgICAgIEFyZ3VtZW50cygpICAgICAgICAKLSAgICB8ICAgUHJvcGVydHlPcGVyYXRvcigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQcm9wZXJ0eSBPcGVyYXRvcnMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFByb3BlcnR5T3BlcmF0b3IgKCk6Ci17fQoteyAgICAgICAgICAKLSAgICAgICAgPERPVD4gICAgICBRdWFsaWZpZWRJZGVudGlmaWVyKCkKLSAgICB8ICAgTE9PS0FIRUFEKDIpIDxMQlJBQ0tFVD4gPFJCUkFDS0VUPgotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4KLSAgICB8ICAgICAgICAgICAgICAgIDxMQlJBQ0tFVD4gTGlzdEV4cHJlc3Npb24oKSBbPEVMSVBTRT4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0gPFJCUkFDS0VUPgotfQotCi12b2lkIEFyZ3VtZW50cyAoKToKLXt7dG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7fX0KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIDxMUEFSRU4+IDxSUEFSRU4+Ci0gICAgfCAgIExPT0tBSEVBRCgyKSA8TFBBUkVOPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+Ci0gICAgfCAgICAgICAgICAgICAgICA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIFs8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpXSA8UlBBUkVOPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVW5hcnkgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVW5hcnlFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgICAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICA8REVMRVRFPiBQb3N0Zml4RXhwcmVzc2lvbigpCi0gICAgfCAgIDxWT0lEPiAgIFVuYXJ5RXhwcmVzc2lvbigpCi0gICAgfCAgIDxUWVBFT0Y+IFVuYXJ5RXhwcmVzc2lvbigpCi0gICAgfCAgIDxJTkNSPiAgIFBvc3RmaXhFeHByZXNzaW9uKCkKLSAgICB8ICAgPERFQ1I+ICAgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICA8UExVUz4gICBVbmFyeUV4cHJlc3Npb24oKQotICAgIHwgICA8TUlOVVM+ICBVbmFyeUV4cHJlc3Npb24oKQotICAgIHwgICA8VElMREU+ICBVbmFyeUV4cHJlc3Npb24oKQotICAgIHwgICA8QkFORz4gICBVbmFyeUV4cHJlc3Npb24oKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTXVsdGlwbGljYXRpdmUgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgTXVsT3AoKToKLXt9Ci17Ci0gICAgICAgIDxTVEFSPgotICAgIHwgICA8U0xBU0g+Ci0gICAgfCAgIDxSRU0+IAotfQotCi12b2lkIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgKE11bE9wKCkgVW5hcnlFeHByZXNzaW9uKCkpKgotCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBZGRpdGl2ZSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBBZGRPcCgpOgote30KLXsKLSAgICAgICAgPFBMVVM+Ci0gICAgfCAgIDxNSU5VUz4KLX0KLQotdm9pZCBBZGRpdGl2ZUV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIChBZGRPcCgpIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpKSoKLX0gCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCaXR3aXNlIFNoaWZ0IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFNoaWZ0T3AoKToKLXt9Ci17Ci0gICAgICAgIDxMU0hJRlQ+Ci0gICAgfCAgIDxSU0lHTkVEU0hJRlQ+Ci0gICAgfCAgIDxSVU5TSUdORURTSElGVD4KLX0KLQotdm9pZCBTaGlmdEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEFkZGl0aXZlRXhwcmVzc2lvbigpIChTaGlmdE9wKCkgQWRkaXRpdmVFeHByZXNzaW9uKCkpKgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUmVsYXRpb25hbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBSZWxPcCgpOgote30KLXsKLSAgICAgICAgPExUPgotICAgIHwgICA8R1Q+IAotICAgIHwgICA8TEU+IAotICAgIHwgICA8R0U+Ci0gICAgfCAgIDxJUz4KLSAgICB8ICAgPEFTPgotfQotCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIChMT09LQUhFQUQoMykoUmVsT3AoKSB8IDxJTj4gfCA8SU5TVEFOQ0VPRj4gKSBTaGlmdEV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgICgoUmVsT3AoKSB8IDxJTlNUQU5DRU9GPikgIFNoaWZ0RXhwcmVzc2lvbigpKSoKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVxdWFsaXR5IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEVxdWFsT3AoKToKLXt9Ci17Ci0gICAgICAgIDxFUT4gCi0gICAgfCAgIDxORT4gCi0gICAgfCAgIDxJREVOVElUWU9QRVI+IAotICAgIHwgICA8Tk9USURFTlRJVFlPUEVSPgotfQotCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAoRXF1YWxPcCgpIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQmluYXJ5IEJpdHdpc2UgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgQml0d2lzZUFORE9wKCk6Ci17fQotewotICAgICAgICA8QklUX0FORD4KLX0KLQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKEJpdHdpc2VBTkRPcCgpIEVxdWFsaXR5RXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZUFORE9wKCkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotCi12b2lkIEJpdHdpc2VYT1JPcCgpOgote30KLXsKLSAgICAgICAgPFhPUj4KLX0KLQotdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb24oKSAoQml0d2lzZVhPUk9wKCkgQml0d2lzZUFOREV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZVhPUk9wKCkgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi12b2lkIEJpdHdpc2VPUk9wKCk6Ci17fQotewotICAgICAgICA8QklUX09SPgotfQotCi12b2lkIEJpdHdpc2VPUkV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uKCkgKEJpdHdpc2VPUk9wKCkgQml0d2lzZVhPUkV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlT1JPcCgpIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJpbmFyeSBMb2dpY2FsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCkgKDxTQ19BTkQ+IEJpdHdpc2VPUkV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpICg8U0NfQU5EPiBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotdm9pZCBMb2dpY2FsT1JFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbigpICg8U0NfT1I+IExvZ2ljYWxBTkRFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb25kaXRpb25hbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBDb25kaXRpb25hbEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKSBbPEhPT0s+ICBBc3NpZ25tZW50RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTigpICBbPEhPT0s+ICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLXZvaWQgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKSBbPEhPT0s+ICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgWzxIT09LPiAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBc3NpZ25tZW50IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEFzc2lnbmVtZW50T3BlcmF0b3IoKToKLXt9Ci17Ci0gICAgICAgIDxBU1NJR04+Ci0gICAgfCAgIDxTVEFSQVNTSUdOPgotICAgIHwgICA8U0xBU0hBU1NJR04+IAotICAgIHwgICA8UkVNQVNTSUdOPiAKLSAgICB8ICAgPFBMVVNBU1NJR04+Ci0gICAgfCAgIDxNSU5VU0FTU0lHTj4gCi0gICAgfCAgIDxMU0hJRlRBU1NJR04+IAotICAgIHwgICA8UlNJR05FRFNISUZUQVNTSUdOPgotICAgIHwgICA8UlVOU0lHTkVEU0hJRlRBU1NJR04+Ci0gICAgfCAgIDxBTkRBU1NJR04+IAotICAgIHwgICA8WE9SQVNTSUdOPiAKLSAgICB8ICAgPE9SQVNTSUdOPgotICAgIHwgICA8U0NfQU5EQVNTSUdOPgotICAgIHwgICA8U0NfWE9SQVNTSUdOPgotICAgIHwgICA8U0NfT1JBU1NJR04+Ci0gCi19Ci0KLXZvaWQgQXNzaWdubWVudEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIFtMT09LQUhFQUQoMikgQXNzaWduZW1lbnRPcGVyYXRvcigpIEFzc2lnbm1lbnRFeHByZXNzaW9uKCldCi19Ci0KLXZvaWQgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgW0xPT0tBSEVBRCgyKSBBc3NpZ25lbWVudE9wZXJhdG9yKCkgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb21tYSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgTGlzdEV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpICg8Q09NTUE+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkpKgotfSAgIAotCi12b2lkIExpc3RFeHByZXNzaW9uTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpICg8Q09NTUE+IEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpKSoKLX0gICAKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFR5cGUgRXhwcmVzc2lvbnMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFR5cGVFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKQotfQotCi12b2lkIFR5cGVFeHByZXNzaW9uTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpCi19Ci0KLXZvaWQgVHlwZUV4cHJlc3Npb25MaXN0ICgpOgote30KLXsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSAoPENPTU1BPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpKSoKLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdGFlbWVudHMgKGFiYnJldiwgbm9TaG9ydElmLCBmdWxsKSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFN0YXRlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSBFeHByZXNzaW9uU3RhdGVtZW50KCkgU2MoKQotICAgIHwgICAgICAgICAgICAgICAgU3VwZXJTdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBCbG9jaygpCi0gICAgfCAgICAgICAgICAgICAgICBMYWJlbGVkU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIElmU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIFN3aXRjaFN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICBEb1N0YXRlbWVudCgpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIFdoaWxlU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIEZvclN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICBXaXRoU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIENvbnRpbnVlU3RhdGVtZW50KCkgU2MoKQotICAgIHwgICAgICAgICAgICAgICAgQnJlYWtTdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBSZXR1cm5TdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBUaHJvd1N0YXRlbWVudCgpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIFRyeVN0YXRlbWVudCgpCi19Ci0KLXZvaWQgU3Vic3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgICAgICAgICAgICAgIEVtcHR5U3RhdGVtZW50KCkKLSAgICB8ICAgTE9PS0FIRUFEKDIpIFN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICBTaW1wbGVWYXJpYWJsZURlZmluaXRpb24oKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzKCkgICAgICAgICAgICAgICA8TEJSQUNFPiBTdWJzdGF0ZW1lbnRzKCkgPFJCUkFDRT4KLX0KLQotdm9pZCBTdWJzdGF0ZW1lbnRzICgpOgote30KLXsKLSAgICAgICAgKFN1YnN0YXRlbWVudCgpKSsKLX0KLQotSkFWQUNPREUKLSAgdm9pZCBTYygpIHsKLSAgICBUb2tlbiB0b2sgPSBnZXRUb2tlbigxKTsKLSAgICBpZiAodG9rLmtpbmQgPT0gU0VNSUNPTE9OKSB7Ci0gICAgICAgdG9rID0gZ2V0TmV4dFRva2VuKCk7Ci0gICAgfSBlbHNlIGlmICh0b2suc3BlY2lhbFRva2VuICE9IG51bGwpIHsKLSAgICAgICBpZiAoIUVvbENvbW1lbnRTa2lwV3ModG9rLnNwZWNpYWxUb2tlbikgJiYgKHRvay5raW5kICE9IEVPRikpIHsKLSAgICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgfQotICAgIH0gZWxzZSBpZiAoKHRvay5raW5kICE9IEVPRikgJiYgKHRvay5raW5kIT1SQlJBQ0UpKSB7Ci0gICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0gCi1KQVZBQ09ERQotICBib29sZWFuIEVvbENvbW1lbnRTa2lwV3MoVG9rZW4gdCkgewotICAgIGJvb2xlYW4gcmV0VmFsID0gZmFsc2U7Ci0gICAgVG9rZW4gc3BlY2lhbFRva2VuID0gdDsKLSAgICB3aGlsZShzcGVjaWFsVG9rZW4gIT0gbnVsbCkgewotICAgICAgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gV1MpIHsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHNwZWNpYWxUb2tlbi5raW5kID09IEVPTCAgfHwKLSAgICAgICAgICAgICAgc3BlY2lhbFRva2VuLmtpbmQgPT0gU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotICAgICAgICByZXRWYWwgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVtcHR5IFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEVtcHR5U3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8U0VNSUNPTE9OPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwcmVzaW9uIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEV4cHJlc3Npb25TdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIExpc3RFeHByZXNzaW9uKCkgCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdXBlciBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBTdXBlclN0YXRlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIDxTVVBFUj4gQXJndW1lbnRzKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJsb2NrIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEJsb2NrICgpOgote30KLXsgICAKLSAgICAgICAgPExCUkFDRT4gW0RpcmVjdGl2ZXMoKV0gPFJCUkFDRT4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExhYmVsZWQgU3RhdGVtZW50IChtYXBzIHRvIGxpdGVyYWwgZmllbGQpCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBMYWJlbGVkU3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgSWRlbnRpZmllcigpIDxDT0xPTj4gU3Vic3RhdGVtZW50KCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElmIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIElmU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8SUY+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4gCi0gICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKSAKLSAgICAgICAgICAgIFtMT09LQUhFQUQoMSkgPEVMU0U+IFN1YnN0YXRlbWVudCgpXQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU3dpdGNoIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFN3aXRjaFN0YXRlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIDxTV0lUQ0g+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLSAgICAgICAgICAgICAgICAgPExCUkFDRT4gW0Nhc2VFbGVtZW50cygpXSA8UkJSQUNFPgotfQotCi12b2lkIENhc2VFbGVtZW50cyAoKToKLXt9Ci17Ci0gICAgICAgIENhc2VMYWJlbCgpIChDYXNlRWxlbWVudCgpKSoKLX0KLQotdm9pZCBDYXNlRWxlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIERpcmVjdGl2ZSgpCi0gICAgfCAgIENhc2VMYWJlbCgpCi19Ci0KLXZvaWQgQ2FzZUxhYmVsICgpOgote30KLXsKLSAgICAgICAgPENBU0U+IExpc3RFeHByZXNzaW9uKCkgPENPTE9OPgotICAgIHwgICA8X0RFRkFVTFQ+IDxDT0xPTj4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERvLVdoaWxlIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIERvU3RhdGVtZW50KCk6IAote30KLXsKLSAgICAgICAgPERPPiBTdWJzdGF0ZW1lbnQoKSA8V0hJTEU+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdoaWxlIFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgV2hpbGVTdGF0ZW1lbnQgKCk6Ci17fQotewotICAgICAgICA8V0hJTEU+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLSAgICAgICAgICAgU3Vic3RhdGVtZW50KCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZvciBTdGF0ZW1lbnRzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRm9yU3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgIExPT0tBSEVBRCg8Rk9SPiA8TFBBUkVOPiBGb3JJbkJpbmRpbmcoKSA8SU4+KQotICAgICAgICAgICAgICAgICAgIDxGT1I+IDxMUEFSRU4+IEZvckluQmluZGluZygpIDxJTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotICAgICAgICAgICAgICAgICAgICAgIFN1YnN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgPEZPUj4gPExQQVJFTj4gW0ZvckluaXRpYWxpemVyKCldIDxTRU1JQ09MT04+IAotICAgICAgICAgICAgICAgICAgICAgICBbTGlzdEV4cHJlc3Npb24oKV0gPFNFTUlDT0xPTj4gCi0gICAgICAgICAgICAgICAgICAgICAgIFtMaXN0RXhwcmVzc2lvbigpXSA8UlBBUkVOPiAKLSAgICAgICAgICAgICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKQotfQotCi12b2lkIEZvckluaXRpYWxpemVyICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpIExpc3RFeHByZXNzaW9uTm9JTigpCi0gICAgfCAgICAgICAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25Ob0lOKCkKLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25Ob0lOKCkKLX0KLQotdm9pZCBGb3JJbkJpbmRpbmcgKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICAgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ05vSU4oKQotICAgIHwgICAgICAgICAgICAgICAgQXR0cmlidXRlcygpICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdOb0lOKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdpdGggU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgV2l0aFN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFdJVEg+IDxMUEFSRU4+IEV4cHJlc3Npb25TdGF0ZW1lbnQoKSA8UlBBUkVOPgotICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRpbnVlIGFuZCBCcmVhayBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIENvbnRpbnVlU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8Q09OVElOVUU+IFtJZGVudGlmaWVyKCldCi19Ci0KLXZvaWQgQnJlYWtTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxCUkVBSz4gW0lkZW50aWZpZXIoKV0KLX0KLSAKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJldHVybiBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFJldHVyblN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFJFVFVSTj4gW0xpc3RFeHByZXNzaW9uKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUaHJvdyBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFRocm93U3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8VEhST1c+IExpc3RFeHByZXNzaW9uKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRyeSBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFRyeVN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFRSWT4gQmxvY2soKQotICAgICAgICAoPENBVENIPiA8TFBBUkVOPiBJZGVudGlmaWVyKCkgPFJQQVJFTj4gQmxvY2soKSkqCi0gICAgICAgIFs8RklOQUxMWT4gQmxvY2soKV0KLX0gCi0gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRGlyZWN0aXZlcyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIERpcmVjdGl2ZXMgKCk6Ci17fQotewotICAgICAgICAoRGlyZWN0aXZlKCkpKwotfQotCi12b2lkIERpcmVjdGl2ZSAoKToKLXt9Ci17Ci0gICAgICAgICAgICAgICAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKQotICAgICB8ICAgTE9PS0FIRUFEKDMpIFN0YXRlbWVudCgpCi0gICAgIHwgICBMT09LQUhFQUQoMikgQW5ub3RhdGFibGVEaXJlY3RpdmUoKQotICAgICB8ICAgTE9PS0FIRUFEKDIpIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgIDxMQlJBQ0U+IERpcmVjdGl2ZXMoKSA8UkJSQUNFPgotICAgICB8ICAgTE9PS0FIRUFEKDIpIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgIEFubm90YXRhYmxlRGlyZWN0aXZlKCkgCi0gICAgIHwgICAgICAgICAgICAgICAgSW5jbHVkZURpcmVjdGl2ZSgpICAgICAgU2MoKQotICAgICB8ICAgICAgICAgICAgICAgIFByYWdtYSgpICAgICAgICAgICAgICAgIFNjKCkKLX0KLQotdm9pZCBBbm5vdGF0YWJsZURpcmVjdGl2ZSAoKToKLXt9Ci17Ci0gICAgICAgICBWYXJpYWJsZURlZmluaXRpb24oKSBTYygpCi0gICAgIHwgICBGdW5jdGlvbkRlZmluaXRpb24oKQotICAgICB8ICAgQ2xhc3NEZWZpbml0aW9uKCkKLSAgICAgfCAgIEludGVyZmFjZURlZmluaXRpb24oKQotICAgICB8ICAgTmFtZXNwYWNlRGVmaW5pdGlvbigpIFNjKCkKLSAgICAgfCAgIEltcG9ydERpcmVjdGl2ZSgpIFNjKCkKLSAgICAgfCAgIEV4cG9ydERlZmluaXRpb24oKSBTYygpCi0gICAgIHwgICBVc2VEaXJlY3RpdmUoKSBTYygpCi19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQXR0cmlidXRlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgQXR0cmlidXRlcyAoKToKLXt9Ci17Ci0gICAgICAgIChBdHRyaWJ1dGUgKCkpKwotfQotCi12b2lkIEF0dHJpYnV0ZSAoKToKLXt9Ci17Ci0gICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFeHByZXNzaW9uKCkKLSAgICB8ICAgICAgICAgICAgICAgIDxUUlVFPgotICAgIHwgICAgICAgICAgICAgICAgPEZBTFNFPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVXNlIERpcmVjdGl2ZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVXNlRGlyZWN0aXZlICgpOgote30KLXsgCi0gICAgICAgIDxVU0U+IDxOQU1FU1BBQ0U+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEltcG9ydCBEaXJlY3RpdmUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEltcG9ydERpcmVjdGl2ZSAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSA8SU1QT1JUPiBQYWNrYWdlTmFtZSgpCi0gICAgfCAgICAgICAgICAgICAgICA8SU1QT1JUPiBJZGVudGlmaWVyKCkgPEFTU0lHTj4gUGFja2FnZU5hbWUoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSW5jbHVkZSBEaXJlY3RpdmUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEluY2x1ZGVEaXJlY3RpdmUgKCk6IAote30KLXsKLSAgICAgICAgPElOQ0xVREU+IDxTVFJJTkdfTElURVJBTD4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByYWdtYQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgUHJhZ21hICgpOgote30KLXsKLSAgICAgICAgPFVTRT4gUHJhZ21hSXRlbXMoKQotfQotCi12b2lkIFByYWdtYUl0ZW1zICgpOgote30KLXsKLSAgICAgICAgUHJhZ21hSXRlbSgpICg8Q09NTUE+IFByYWdtYUl0ZW0oKSkKLX0KLQotdm9pZCBQcmFnbWFJdGVtICgpOgote30KLXsKLSAgICAgICAgUHJhZ21hRXhwcigpIFs8SE9PSz5dCi19Ci0KLQotdm9pZCBQcmFnbWFFeHByICgpOgote30KLXsKLSAgICAgICAgSWRlbnRpZmllcigpIFs8TFBBUkVOPiBQcmFnbWFBcmd1bWVudCgpIDxSUEFSRU4+XQotfQotCi12b2lkIFByYWdtYUFyZ3VtZW50ICgpOgote30KLXsKLSAgICAgICAgPFRSVUU+Ci0gICAgfCAgIDxGQUxTRT4KLSAgICB8ICAgPERFQ0lNQUxfTElURVJBTD4gCi0gICAgfCAgIDxPQ1RBTF9MSVRFUkFMPgotICAgIHwgICA8SEVYX0xJVEVSQUw+Ci0gICAgfCAgIDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiAKLSAgICB8ICAgPFNUUklOR19MSVRFUkFMPiAKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERlZmluaXRpb25zIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEV4cG9ydCBEZWZpbml0aW9uIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRXhwb3J0RGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxFWFBPUlQ+IEV4cG9ydEJpbmRpbmdMaXN0ICgpCi19Ci0KLXZvaWQgRXhwb3J0QmluZGluZ0xpc3QgKCk6Ci17fQotewotICAgICAgICBFeHBvcnRCaW5kaW5nKCkgKDxDT01NQT4gRXhwb3J0QmluZGluZygpKSoKLX0KLQotdm9pZCBFeHBvcnRCaW5kaW5nICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIEZ1bmN0aW9uTmFtZSAoKQotICAgIHwgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lICgpIDxBU1NJR04+IEZ1bmN0aW9uTmFtZSAoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmFyaWFibGUgRGVmaW5pdGlvbiAoaW4sIE5vSU4pCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBWYXJpYWJsZURlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCkgVmFyaWFibGVCaW5kaW5nTGlzdCgpCi19Ci0KLXZvaWQgVmFyaWFibGVEZWZpbml0aW9uTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTigpCi19Ci0KLQotdm9pZCBWYXJpYWJsZURlZmluaXRpb25LaW5kICgpOgote30KLXsKLSAgICAgICAgPFZBUj4KLSAgICB8ICAgPENPTlNUPgotfQotCi12b2lkIFZhcmlhYmxlQmluZGluZ0xpc3QgKCk6Ci17fQotewotICAgVmFyaWFibGVCaW5kaW5nKCkgKDxDT01NQT4gVmFyaWFibGVCaW5kaW5nICgpKSoKLX0KLQotdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAoKToKLXt9Ci17Ci0gICBWYXJpYWJsZUJpbmRpbmdOb0lOKCkgKDxDT01NQT4gVmFyaWFibGVCaW5kaW5nTm9JTigpKSoKLX0KLQotdm9pZCBWYXJpYWJsZUJpbmRpbmcgKCk6Ci17fQotewotICAgICAgICBUeXBlZElkZW50aWZpZXIoKSBbVmFyaWFibGVJbml0aWFsaXNhdGlvbigpXQotfQotCi12b2lkIFZhcmlhYmxlQmluZGluZ05vSU4gKCk6Ci17fQotewotICAgICAgICBUeXBlZElkZW50aWZpZXJOb0lOKCkgW1ZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKCldCi19Ci0KLQotdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uICgpOgote30KLXsKLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplciAoKQotfQotCi12b2lkIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOICgpOgote30KLXsKLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKCkKLX0KLQotdm9pZCBWYXJpYWJsZUluaXRpYWxpemVyICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpIEFzc2lnbm1lbnRFeHByZXNzaW9uICgpCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpCi19Ci0KLXZvaWQgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOICgpCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpCi19Ci0KLQotdm9pZCBUeXBlZElkZW50aWZpZXIgKCk6Ci17fQotewotICAgICAgICBJZGVudGlmaWVyICgpIFs8Q09MT04+IFR5cGVFeHByZXNzaW9uKCldCi19Ci0KLXZvaWQgVHlwZWRJZGVudGlmaWVyTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIElkZW50aWZpZXIgKCkgWzxDT0xPTj4gVHlwZUV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTaW1wbGUgVmFyaWFibGUgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxWQVI+IFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCkKLX0KLQotdm9pZCBVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCAoKToKLXt9Ci17Ci0gICAgICAgIFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoKSAoPENPTU1BPiBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCkpKgotfQotCi12b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmcgKCk6Ci17fQotewotICAgICAgICBJZGVudGlmaWVyKCkgVmFyaWFibGVJbml0aWFsaXNhdGlvbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBGdW5jdGlvbiBEZWZpbml0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBGdW5jdGlvbkRlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICA8RlVOQ1RJT04+IEZ1bmN0aW9uTmFtZSgpIEZ1bmN0aW9uQ29tbW9uKCkKLX0KLQotdm9pZCBGdW5jdGlvbk5hbWUgKCk6Ci17fQotewotICAgICAgICAvLyBubyBsaW5lIGJyZWFrIGFmdGVyIGdldAotICAgICAgICBMT09LQUhFQUQoMikgPEdFVD4gSWRlbnRpZmllcigpCi0gICAgICAgIC8vIG5vIGxpbmUgYnJlYWsgYWZ0ZXIgZ2V0Ci0gICAgfCAgIExPT0tBSEVBRCgyKSA8U0VUPiBJZGVudGlmaWVyKCkKLSAgICB8ICAgICAgICAgICAgICAgICBJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBGdW5jdGlvbkNvbW1vbiAoKToKLXt9Ci17Ci0gICAgICAgIDxMUEFSRU4+IFtQYXJhbWV0ZXJzKCldIDxSUEFSRU4+IFtSZXN1bHQoKV0gQmxvY2soKQotfQotCi12b2lkIFBhcmFtZXRlcnMgKCk6Ci17fQotewotICAgICAgICBSZXN0UGFyYW1ldGVycygpCi0gICAgfCAgIFBhcmFtZXRlckluaXQoKSAoPENPTU1BPiBQYXJhbWV0ZXJJbml0KCkpKiBbUmVzdFBhcmFtZXRlcnMoKV0KLX0KLQotdm9pZCBQYXJhbWV0ZXIgKCk6Ci17fQotewotICAgICAgICBbPENPTlNUPl0gVHlwZWRJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBQYXJhbWV0ZXJJbml0ICgpOgote30KLXsKLSAgICAgICAgUGFyYW1ldGVyKCkgWzxBU1NJR04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldCi19Ci0KLXZvaWQgUmVzdFBhcmFtZXRlcnMgKCk6Ci17fQotewotICAgICAgICA8RUxJUFNFPiBbPENPTlNUPiBJZGVudGlmaWVyKCldCi19Ci0KLXZvaWQgUmVzdWx0ICgpOgote30KLXsKLSAgICAgICAgPENPTE9OPiBUeXBlRXhwcmVzc2lvbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDbGFzcyBEZWZpbml0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBDbGFzc0RlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICA8Q0xBU1M+IElkZW50aWZpZXIoKSBbSW5oZXJpdGFuY2UoKV0gQmxvY2soKQotfQotCi12b2lkIEludGVyZmFjZURlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgPElOVEVSRkFDRT4gSWRlbnRpZmllcigpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIDxJTlRFUkZBQ0U+IElkZW50aWZpZXIoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs8RVhURU5EUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldIEJsb2NrKCkKLX0KLQotCi12b2lkIEluaGVyaXRhbmNlICgpOgote30KLXsgCi0gICAgICAgIDxFWFRFTkRTPiBUeXBlRXhwcmVzc2lvbigpIFs8SU1QTEVNRU5UUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldCi0gICAgfCAgIDxJTVBMRU1FTlRTPiBUeXBlRXhwcmVzc2lvbkxpc3QoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTmFtZXNwYWNlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBOYW1lc3BhY2VEZWZpbml0aW9uICgpOgote30KLXsKLSAgICAgICAgPE5BTUVTUEFDRT4gSWRlbnRpZmllcigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQYWNrYWdlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBQYWNrYWdlRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxQQUNLQUdFPiBbUGFja2FnZU5hbWUoKV0gQmxvY2soKQotfQotCi12b2lkIFBhY2thZ2VOYW1lICgpOgote30KLXsKLSAgICAgICAgPFNUUklOR19MSVRFUkFMPgotICAgIHwgICBQYWNrYWdlSWRlbnRpZmllcnMoKQotfQotCi12b2lkIFBhY2thZ2VJZGVudGlmaWVycyAoKToKLXt9Ci17Ci0gICAgICAgIElkZW50aWZpZXIoKSAoPERPVD4gSWRlbnRpZmllcigpKSoKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0RlcHRoRmlyc3RUcmF2ZXJzYWwuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0RlcHRoRmlyc3RUcmF2ZXJzYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0YTQzMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9EZXB0aEZpcnN0VHJhdmVyc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHRjb21waWxlcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBEZXB0aEZpcnN0VHJhdmVyc2FsIGltcGxlbWVudHMgSlNQYXJzZXIyMFZpc2l0b3IKLXsKLSAgcHJvdGVjdGVkIFByaW50U3RyZWFtIG91dDsKLSAgcHJpdmF0ZSBib29sZWFuIF9kZWJ1ZzsKLSAgcHJpdmF0ZSBpbnQgZGVwdGg7Ci0gIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZVRhYmxlOwotCi0gIHB1YmxpYyBEZXB0aEZpcnN0VHJhdmVyc2FsKCkKLSAgewotICAgIG91dCA9IFN5c3RlbS5vdXQ7Ci0gICAgX2RlYnVnID0gdHJ1ZTsKLSAgICBkZXB0aCA9IDA7Ci0gIH0KLQotCi0gIHB1YmxpYyBEZXB0aEZpcnN0VHJhdmVyc2FsKFByaW50U3RyZWFtIG8pCi0gIHsKLSAgICBvdXQgPSBvOwotICAgIF9kZWJ1ZyA9IHRydWU7Ci0gICAgZGVwdGggPSAwOwotICB9Ci0KLSAgcHVibGljIERlcHRoRmlyc3RUcmF2ZXJzYWwoUHJpbnRTdHJlYW0gbywgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdE1hcCkKLSAgewotICAgIG91dCA9IG87Ci0gICAgX2RlYnVnID0gdHJ1ZTsKLSAgICBkZXB0aCA9IDA7Ci0gICAgbmFtZVRhYmxlID0gdE1hcDsKLSAgfQotCi0KLSAgcHVibGljIE9iamVjdCBkZXB0aEZpcnN0VHJhdmVyc2FsKFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aCsrOwotCi0gICAgVG9rZW4gdDEgPSBub2RlLmdldEZpcnN0VG9rZW4oKTsKLSAgICBUb2tlbiB0ID0gbmV3IFRva2VuKCk7Ci0gICAgdC5uZXh0ID0gdDE7Ci0KLSAgICBTaW1wbGVOb2RlIG47Ci0KLSAgICBmb3IgKGludCBvcmQgPSAwOyBvcmQgPCBub2RlLmpqdEdldE51bUNoaWxkcmVuKCk7IG9yZCsrKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyAgR2V0IHRoZSBuZXh0IGNoaWQgbm9kZSBpbiBzZXF1ZW5jZS4KLSAgICAgIC8vCi0gICAgICBuID0gKFNpbXBsZU5vZGUpIG5vZGUuamp0R2V0Q2hpbGQob3JkKTsKLQotICAgICAgLy8KLSAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIFRva2VucyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGlzIG5vZGUuCi0gICAgICAvLwotICAgICAgaWYgKF9kZWJ1ZyA9PSB0cnVlKQotICAgICAgewotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgIHQgPSB0Lm5leHQ7Ci0KLSAgICAgICAgICBpZiAodCA9PSBuLmdldEZpcnN0VG9rZW4oKSkgYnJlYWs7Ci0KLSAgICAgICAgICBwcmludCh0KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLwotICAgICAgLy8gRGVwdGggRmlzdCBzZWFyY2ggc28gdmlzaXQgdGhpcyBub2RlcyBjaGlsZHJlbiBiZWZvcmUgc2libGluZ3MKLSAgICAgIC8vCi0gICAgICBuLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQotICAgICAgdCA9IG4uZ2V0TGFzdFRva2VuKCk7Ci0gICAgfQotCi0gICAgaWYgKF9kZWJ1ZyA9PSB0cnVlKQotICAgIHsKLSAgICAgIHdoaWxlICh0ICE9IG5vZGUuZ2V0TGFzdFRva2VuKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICh0Lm5leHQgPT0gbnVsbCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdCA9IHQubmV4dDsKLSAgICAgICAgcHJpbnQodCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZGVwdGgtLTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJpbnROb2RlKFNpbXBsZU5vZGUgbm9kZSkKLSAgewotICAgIFRva2VuIHQgPSBub2RlLmdldEZpcnN0VG9rZW4oKTsKLQotICAgIHdoaWxlICh0ICE9IG5vZGUuZ2V0TGFzdFRva2VuKCkpCi0gICAgewotICAgICAgcHJpbnQodCk7Ci0gICAgICB0ID0gdC5uZXh0OwotICAgIH0KLQotICAgIHByaW50KG5vZGUuZ2V0TGFzdFRva2VuKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoVG9rZW4gdCkKLSAgewotICAgIC8vCi0gICAgLy8gIEhhY2sgQWxlcnQ6IER1ZSB0byBhbiBlcnJvciB3aXRoIHRoZSBsZWFmIG5vZGUgQVNURW9sV2l0aENvbW1lbnRzCi0gICAgLy8gIFdpY2ggb25seSBtYXRjaGVzIHNwZWNpYWwgYW5kIG5vIHJlZ3VsYXIgdG9rZW5zIHRodXMgd2UgZ2V0IHRoZSBuZXh0Ci0gICAgLy8gIHZhbGlkIGxlYWZzIHRva2VuIHN0dWNrIGluIGhlcmUuIFRodXMgd2UgZ2V0IGR1cGxpY2F0ZSBpbmZvIGluIGVhY2ggZmlsZS4KLSAgICAvLyAgRml4ZWQgdGhpcyB3aXRoIHNpbXBsZSBmbGFnIHRvIHJlY29nbml6ZXMgaWYgdGhlIHRva2VuIGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgLy8gIHdyaXR0ZW4gb3V0Lk5lZWQgdG8gcmVmYWN0b3IgdGhhdCB0ZXJtaW5hbC4KLSAgICAvLwotICAgIGlmICh0Lmhhc1ByaW50ZWQgPT0gdHJ1ZSkgcmV0dXJuOwotICAgIAotICAgIFRva2VuIHR0ID0gdC5zcGVjaWFsVG9rZW47Ci0KLSAgICBpZiAodHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3aGlsZSAodHQuc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgICAgIHR0ID0gdHQuc3BlY2lhbFRva2VuOwotCi0gICAgICB3aGlsZSAodHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KGFkZFVuaWNvZGVFc2NhcGVzKHR0LmltYWdlKSk7Ci0gICAgICAgIHR0ID0gdHQubmV4dDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8KLSAgICAvLyAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBUb2tlbiBpcyBhbiBpZGVudGlmaWVyIGtpbmQuCi0gICAgLy8KLSAgICBpZiAodC5raW5kID09IDc4KSAKLSAgICB7Ci0gICAgICAvLwotICAgICAgLy8gIFBvdGVudGlhbCBpdGVtIHRvIHN3YXAgb3V0LgotICAgICAgLy8KLSAgICAgIFN0cmluZyB0ZW1wID0gbmFtZVRhYmxlLmdldCh0LmltYWdlKTsKLSAgICAgIGlmICh0ZW1wICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0LmltYWdlID0gdGVtcDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHQua2luZCA9PSA3MCB8fCB0LmtpbmQgPT0gNzIgfHwgdC5raW5kID09IDc3KSAKLSAgICB7Ci0gICAgICAvLwotICAgICAgLy8gICBHb3Qgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBhIHBvdGVudGlhbCBjbGFzcyBpbiBpdCAobGlrZSBFdmFsIG9yIAotICAgICAgLy8gICBSZWdFeHAgc28gbmVlZCB0byBzY2FuIHRoZSBzdHJpbmcuCi0gICAgICAvLwotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0OwotICAgICAgaWYgKHQuaW1hZ2UuY2hhckF0KDApID09ICciJyAmJiB0LmltYWdlLmxlbmd0aCgpID4gMikgCi0gICAgICB7Ci0gICAgICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0LmltYWdlLnN1YnN0cmluZygxLCAodC5pbWFnZS5sZW5ndGgoKS0xKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gZWxzZSAKLSAgICAgIHsKLSAgICAgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHQuaW1hZ2UpOwotICAgICAgfQotICAgICAgU3RyaW5nQnVpbGRlciByZXBsYWNlbWVudFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKHQuaW1hZ2UpOwotICAgICAgYm9vbGVhbiB1cGRhdGUgPSBmYWxzZTsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICBTdHJpbmcgdGVtcDEgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICBTdHJpbmcgdGVtcCA9IG5hbWVUYWJsZS5nZXQodGVtcDEpOwotICAgICAgICAgIGlmICh0ZW1wICE9IG51bGwpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IHJlcGxhY2VtZW50U3RyaW5nLmluZGV4T2YodGVtcDEpOwotICAgICAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgdGVtcDEubGVuZ3RoKCk7Ci0gICAgICAgICAgICB1cGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgcmVwbGFjZW1lbnRTdHJpbmcuZGVsZXRlKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgcmVwbGFjZW1lbnRTdHJpbmcuaW5zZXJ0KHN0YXJ0LCB0ZW1wKTsKLSAgICAgICAgICB9IAotICAgICAgfQotICAgICAgaWYgKHVwZGF0ZSA9PSB0cnVlKSAKLSAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9sZCBTdHJpbmcgaXM6IiArIHQuaW1hZ2UpOwotICAgICAgICAgIHQuaW1hZ2UgPSByZXBsYWNlbWVudFN0cmluZy50b1N0cmluZygpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IFN0cmluZyBpczoiICsgdC5pbWFnZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dC5wcmludChhZGRVbmljb2RlRXNjYXBlcyh0LmltYWdlKSk7Ci0gICAgdC5oYXNQcmludGVkID0gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFVuaWNvZGVFc2NhcGVzKFN0cmluZyBzdHIpCi0gIHsKLSAgICBTdHJpbmcgcmV0dmFsID0gIiI7Ci0gICAgY2hhciBjaDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgY2ggPSBzdHIuY2hhckF0KGkpOwotCi0gICAgICBpZiAoKChjaCA8IDB4MjApIHx8IChjaCA+IDB4N2UpKSAmJiAoY2ggIT0gJ1x0JykgJiYgKGNoICE9ICdcbicpICYmCi0gICAgICAgICAgKGNoICE9ICdccicpICYmIChjaCAhPSAnXGYnKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgIHJldHZhbCArPSAoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR2YWwgKz0gY2g7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGJ1aWxkUGFkZGVkU3RyaW5nKFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8PSBkZXB0aDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzYiA9IHNiLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIHNiID0gc2IuYXBwZW5kKHMpOwotCi0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByb2dyYW0gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RRdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmltYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVzZXJ2ZWROYW1lc3BhY2Ugbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUT2JqZWN0TGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURmllbGRMaXN0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsRmllbGQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURmllbGROYW1lIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBcnJheUxpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVsZW1lbnRMaXN0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsRWxlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3VwZXJFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQb3N0Zml4RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXR0cmlidXRlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsTmV3RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25Db25zdHJ1Y3RvciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVsbE5ld1N1YmV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBvc3RmaXhPcCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJvcGVydHlPckFyZ3VtZW50cyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJvcGVydHlPcGVyYXRvciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXJndW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVbmFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bE9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZE9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBZGRpdGl2ZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNoaWZ0T3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNoaWZ0RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsT3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsT3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZUFORE9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlWE9ST3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUk9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlT1JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbEFOREV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbE9SRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXNzaWduZW1lbnRPcGVyYXRvciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGlzdEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpc3RFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLQotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbkxpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0KLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotCi0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN1YnN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3Vic3RhdGVtZW50cyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2Mgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVvbENvbW1lbnRTa2lwV3Mgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVtcHR5U3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdXBlclN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQmxvY2sgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVElmU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTd2l0Y2hTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENhc2VFbGVtZW50cyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUVsZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENhc2VMYWJlbCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURG9TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFdoaWxlU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGb3JTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvckluaXRpYWxpemVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGb3JJbkJpbmRpbmcgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFdpdGhTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENvbnRpbnVlU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCcmVha1N0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmV0dXJuU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUaHJvd1N0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHJ5U3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1REaXJlY3RpdmVzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1REaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFubm90YXRhYmxlRGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBdHRyaWJ1dGVzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBdHRyaWJ1dGUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVzZURpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW1wb3J0RGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJbmNsdWRlRGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWEgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUl0ZW1zIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWFJdGVtIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWFFeHByIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWFBcmd1bWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwb3J0RGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwb3J0QmluZGluZ0xpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cG9ydEJpbmRpbmcgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlZElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVkSWRlbnRpZmllck5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25OYW1lIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkNvbW1vbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFyYW1ldGVycyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFyYW1ldGVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXJJbml0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXN0UGFyYW1ldGVycyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVzdWx0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDbGFzc0RlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEludGVyZmFjZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEluaGVyaXRhbmNlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1ROYW1lc3BhY2VEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYWNrYWdlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFja2FnZU5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhY2thZ2VJZGVudGlmaWVycyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9KYXZhc2NyaXB0Q29tcGlsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0phdmFzY3JpcHRDb21waWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE0NmI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0phdmFzY3JpcHRDb21waWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHRjb21waWxlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLkpTUGFyc2VyMjA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29scy5GaWxlUHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdENvbXBpbGVyIGV4dGVuZHMgRmlsZVByb2Nlc3NvcgotewotICBwcml2YXRlIEpTUGFyc2VyMjAgICAgICAgIF9qc1BhcnNlcjsKLSAgcHVibGljICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiAgICAgICAgIGZpbGVUYWJsZTsKLQotICBwdWJsaWMgSmF2YXNjcmlwdENvbXBpbGVyKCkKLSAgewotICAgIHN1cGVyKCJqcyIsIGZhbHNlKTsKLSAgICBmaWxlVGFibGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXQoSW5wdXRTdHJlYW0gaW4pCi0gIHsKLSAgICAvLyBhcHBseSBvdmVycmlkZXMKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgaW4sIEZpbGUgb3V0KQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBjbGFzc05hbWUsIG5ld0NsYXNzTmFtZTsKLSAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGluKTsKLSAgICAvLwotICAgIC8vICBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUKLSAgICAvLwotICAgIGNsYXNzTmFtZSA9IGluLmdldE5hbWUoKTsKLSAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5pbmRleE9mKCcuJykpOwotICAgIC8vCi0gICAgLy8gIENoZWNrIHRvIHNlZSBpZiB0aGUgbmFtZSBleGlzdHMgYXMgd2UgZG8gbm90IHdhbnQgdG8gb3ZlciB3cml0ZSB0aGUgZm91cgotICAgIC8vICBzcGVjaWFsIG5hbWVzIHdlIGFyZSB1c2luZy4KLSAgICAvLwotICAgIG5ld0NsYXNzTmFtZSA9IGZpbGVUYWJsZS5nZXQoY2xhc3NOYW1lKTsKLSAgICBpZiAoIG5ld0NsYXNzTmFtZSA9PSBudWxsKSAKLSAgICB7Ci0vLyAgICAgICBuZXdDbGFzc05hbWUgPSAiQWRmIiArIGNsYXNzTmFtZTsKLS8vICAgICAgZmlsZVRhYmxlLnB1dChjbGFzc05hbWUsIG5ld0NsYXNzTmFtZSk7Ci0gICAgICBuZXdDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotICAgIG91dCA9IG5ldyBGaWxlKG91dC5nZXRQYXJlbnRGaWxlKCksIG5ld0NsYXNzTmFtZSArICIuanMiKTsKLSAgICBQcmludFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCkpKTsKLSAgICBwcm9jZXNzKGluU3RyZWFtLCBvdXRTdHJlYW0pOwotICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIGluaXRQYXJzZXIoSW5wdXRTdHJlYW0gaW4pCi0gIHsKLQotICAgIGlmIChfanNQYXJzZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfanNQYXJzZXIgPSBuZXcgSlNQYXJzZXIyMChpbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfanNQYXJzZXIuUmVJbml0KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICAgIH0KLSAgfQotICBwdWJsaWMgdm9pZCBwcm9jZXNzKElucHV0U3RyZWFtIGluLCBQcmludFN0cmVhbSBvKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgewotICAgIFRva2VuIHRva2VuID0gbnVsbDsKLSAgICBEZXB0aEZpcnN0VHJhdmVyc2FsIHZzdHI7Ci0gICAgaW5pdChpbik7Ci0gICAgdG9rZW4gPSB0b2tlbml6ZShpbik7Ci0gICAgLy8KLSAgICAvLyAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBEZXB0aEZpcnN0VHJhdmVyc2FsCi0gICAgLy8KLSAgICB2c3RyID0gbmV3IERlcHRoRmlyc3RUcmF2ZXJzYWwobywgZmlsZVRhYmxlKTsgCi0gICAgX2pzUGFyc2VyLmdldFJvb3ROb2RlKCkuamp0QWNjZXB0KHZzdHIsIG51bGwpOwotICB9Ci0gIHByaXZhdGUgVG9rZW4gdG9rZW5pemUoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICB7Ci0gICAgaW5pdFBhcnNlcihpbik7Ci0gICAgcmV0dXJuIChUb2tlbikgX2pzUGFyc2VyLlByb2dyYW0oKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9KYXZhc2NyaXB0Q29tcGlsZXJNYWluLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9KYXZhc2NyaXB0Q29tcGlsZXJNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NWMwY2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0Y29tcGlsZXIvSmF2YXNjcmlwdENvbXBpbGVyTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHRjb21waWxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0Y29tcGlsZXIuSmF2YXNjcmlwdENvbXBpbGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdENvbXBpbGVyTWFpbgotewotICBwcml2YXRlIEphdmFzY3JpcHRDb21waWxlciBfamF2YXNjcmlwdENvbXBpbGVyOwotCi0gIHB1YmxpYyBKYXZhc2NyaXB0Q29tcGlsZXJNYWluKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIEphdmFzY3JpcHRDb21waWxlck1haW4gX21haW4gPSBuZXcgSmF2YXNjcmlwdENvbXBpbGVyTWFpbigpOwotICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIgPSBuZXcgSmF2YXNjcmlwdENvbXBpbGVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIkQ6XFxGb29cXGRhdGExLnR4dCIpOwotICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGZpcyk7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZSA9ICAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4pb2lzLnJlYWRPYmplY3QoKTsgLy8gUmVhZCB0aGUgb2JqZWN0IGJhY2sgaW4gaGVyZQotICAgICAgLy8KLSAgICAgIC8vIAotICAgICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5maWxlVGFibGUucHV0KCJSaWNoT2JqZWN0IiwgIkFkZk9iamVjdCIpOwotICAgICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5maWxlVGFibGUucHV0KCJSaWNoUGFnZSIsICJBZGZQYWdlIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIlJpY2hDb252ZXJ0ZXIiLCAiQWRmQ29udmVydGVyIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIlJpY2hWYWxpZGF0b3IiLCAiQWRmVmFsaWRhdG9yIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIkJvb3RzdHJhcCIsICJBZGZCb290c3RyYXAiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiQm9vdHN0cmFwRmFjZXMiLCAiQWRmQm9vdHN0cmFwRmFjZXMiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiWE1MUmVxdWVzdCIsICJBZGZYTUxSZXF1ZXN0Iik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIk1hcnNoYWxpbmdTZXJ2aWNlIiwgIkFkZk1hcnNoYWxpbmdTZXJ2aWNlIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIk1lc3NhZ2luZ1NlcnZpY2UiLCAiQWRmTWVzc2FnaW5nU2VydmljZSIpOwotICAgICAgb2lzLmNsb3NlKCk7Ci0gICAgICBmaXMuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFRPRE8KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVE9ETwotICAgIH0KLSAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSAKLSAgICB7Ci0gICAgICAvLyBUT0RPCi0gICAgfQotICAgIEZpbGUgaW4gPSAKLSAgICAgIG5ldyBGaWxlKCJEOlxcamRldnJ0XFxhZGYtZmFjZXNcXHRydW5rXFxhZGYtcmljaGNsaWVudC1kZW1vXFxzcmNcXG1haW5cXHdlYmFwcFxcanNMaWJzIik7Ci0gICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgiRDpcXEZvb1xcRGVtb1xcanNMaWJzIik7Ci0gICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5wcm9jZXNzKGluLCBvdXQpOwotICAgIGluID0gCi0gICAgICBuZXcgRmlsZSgiRDpcXGpkZXZydFxcYWRmLWZhY2VzXFx0cnVua1xcYWRmLXJpY2hjbGllbnQtZGVtby1jcm1cXHNyY1xcbWFpblxcd2ViYXBwXFxqc0xpYnMiKTsKLSAgICBvdXQgPSBuZXcgRmlsZSgiRDpcXEZvb1xcY3JtXFxqc0xpYnMiKTsKLSAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLnByb2Nlc3MoaW4sIG91dCk7Ci0KLSAgICAvLwotICAgIC8vICBUcmFuc2Zvcm0gdGhlIEFwaSBKYXZhU2NyaXB0IGZpbGVzCi0gICAgLy8KLS8vICAgIEZpbGUgaW4gPSAKLS8vICAgICAgbmV3IEZpbGUoIkQ6XFxqZGV2cnRcXGFkZi1mYWNlc1xcdHJ1bmtcXGFkZi1yaWNoY2xpZW50LWFwaVxcc3JjXFxtYWluXFxqYXZhc2NyaXB0XFxvcmFjbGVcXGFkZlxcdmlldyIpOwotLy8gICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgiRDpcXEZvb1xcYXBpIik7Ci0vLyAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLnByb2Nlc3MoaW4sIG91dCk7Ci0gICAgLy8KLSAgICAvLyAgVHJhbnNmb3JtIHRoZSBJbXBsIEphdmFTY3JpcHQgZmlsZXMKLSAgICAvLwotLy8gICAgaW4gPSAKLS8vICAgICAgIG5ldyBGaWxlKCJEOlxcamRldnJ0XFxhZGYtZmFjZXNcXHRydW5rXFxhZGYtcmljaGNsaWVudC1pbXBsXFxzcmNcXG1haW5cXGphdmFzY3JpcHRcXG9yYWNsZVxcYWRmaW50ZXJuYWxcXHZpZXdcXCIpOwotLy8gICAgb3V0ID0gbmV3IEZpbGUoIkQ6XFxGb29cXGltcGwiKTsKLS8vICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIucHJvY2Vzcyhpbiwgb3V0KTsKLSAgICAvLwotICAgIC8vICBVb2RhdGUgdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgSGFzaE1hcAotICAgIC8vCi0gICAgRmlsZU91dHB1dFN0cmVhbSBmb3M7Ci0gICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vczsKLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJEOlxcRm9vXFxkYXRhMS50eHQiKTsKLSAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZm9zKTsKLSAgICAgIG9vcy53cml0ZU9iamVjdChfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZSk7Ci0gICAgICBvb3MuZmx1c2goKTsKLSAgICAgIG9vcy5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVE9ETwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUT0RPCi0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL0lucHV0U291cmNlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvSW5wdXRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzNGRjNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvSW5wdXRTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBJbnB1dFNvdXJjZQotewotICBwcml2YXRlIGJvb2xlYW4gX3NraXBPYmZ1c2NhdGlvbjsKLSAgcHJpdmF0ZSBib29sZWFuIF9za2lwU3RyaXBDb21tZW50czsKLSAgcHJpdmF0ZSBib29sZWFuIF9za2lwU3RyaXBXaGl0ZXNwYWNlczsKLSAgcHJpdmF0ZSBib29sZWFuIF9za2lwU3RyaXBOZXdsaW5lczsKLSAgcHJpdmF0ZSBib29sZWFuIF9za2lwU3RyaXBTcGVjaWFsS2V5d29yZHM7Ci0gIHByaXZhdGUgSW5wdXRTdHJlYW0gX2luOwotCi0gIHB1YmxpYyBJbnB1dFNvdXJjZShJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiBza2lwT2JmdXNjYXRpb24sCi0gICAgYm9vbGVhbiBza2lwU3RyaXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaXBXaGl0ZXNwYWNlcywKLSAgICBib29sZWFuIHNraXBTdHJpcE5ld2xpbmVzLCBib29sZWFuIHNraXBTdHJpcFNwZWNpYWxLZXl3b3JkcykKLSAgewotICAgIF9pbiA9IGluOwotICAgIF9za2lwT2JmdXNjYXRpb24gPSBza2lwT2JmdXNjYXRpb247Ci0gICAgX3NraXBTdHJpcENvbW1lbnRzID0gc2tpcFN0cmlwQ29tbWVudHM7Ci0gICAgX3NraXBTdHJpcFdoaXRlc3BhY2VzID0gc2tpcFN0cmlwV2hpdGVzcGFjZXM7Ci0gICAgX3NraXBTdHJpcE5ld2xpbmVzID0gc2tpcFN0cmlwTmV3bGluZXM7Ci0gICAgX3NraXBTdHJpcFNwZWNpYWxLZXl3b3JkcyA9IHNraXBTdHJpcFNwZWNpYWxLZXl3b3JkczsKLSAgfQotCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpCi0gIHsKLSAgICByZXR1cm4gX2luOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcE9iZnVzY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBfc2tpcE9iZnVzY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwQ29tbWVudHMoKQotICB7Ci0gICAgcmV0dXJuIF9za2lwU3RyaXBDb21tZW50czsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcFdoaXRlc3BhY2VzKCkKLSAgewotICAgIHJldHVybiBfc2tpcFN0cmlwV2hpdGVzcGFjZXM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBOZXdsaW5lcygpCi0gIHsKLSAgICByZXR1cm4gX3NraXBTdHJpcE5ld2xpbmVzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzKCkKLSAgewotICAgIHJldHVybiBfc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvT2JmdXNjYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL09iZnVzY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzM2Y1OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvT2JmdXNjYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvcjsKLQotLy9+LS0tIG5vbi1KREsgaW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuY29uZmlndXJhdGlvbi5Db25maWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuY29uZmlndXJhdGlvbi5PYmZ1c2NhdG9yQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuT2JmdXNjYXRvckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmNvbXByZXNzaW9uLkNvbXByZXNzaW9uRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMua2V5d29yZHMuU3BlY2lhbEtleXdvcmRzRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb24uT2JmdXNjYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vdXRwdXQuT3V0cHV0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuSlNQYXJzZXIxNTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzLkZpbGVQcm9jZXNzb3I7Ci0KLS8vfi0tLSBKREsgaW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKLQotLy9+LS0tIGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY2xhc3MgT2JmdXNjYXRvcgotICBleHRlbmRzIEZpbGVQcm9jZXNzb3IKLXsKLSAgcHJpdmF0ZSBWZWN0b3IgX2ZpbHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHJpdmF0ZSBPYmZ1c2NhdG9yRmlsdGVyIF9rZXl3b3Jkc0ZpbHRlciA9IG5ldyBTcGVjaWFsS2V5d29yZHNGaWx0ZXIoKTsKLQotICBwcml2YXRlIE9iZnVzY2F0aW9uRmlsdGVyIF9vYmZ1c2NhdGlvbkZpbHRlciA9IG5ldyBPYmZ1c2NhdGlvbkZpbHRlcigpOwotCi0gIHByaXZhdGUgT3V0cHV0R2VuZXJhdG9yIF9vdXRwdXRHZW5lcmF0b3IgPSBuZXcgT3V0cHV0R2VuZXJhdG9yKCk7Ci0KLSAgcHJpdmF0ZSBPYmZ1c2NhdG9yQ29uZmlnIF9jb25maWc7Ci0KLSAgcHJpdmF0ZSBKU1BhcnNlcjE1IF9qc1BhcnNlcjsKLQotICBwcml2YXRlIGJvb2xlYW4gX29iZnVzY2F0ZTsKLQotICBwcml2YXRlIGJvb2xlYW4gX3JlcGxhY2VDaGFyTGl0ZXJhbHM7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9zdHJpcENvbW1lbnRzOwotCi0gIHByaXZhdGUgYm9vbGVhbiBfc3RyaXBOZXdsaW5lczsKLQotICBwcml2YXRlIGJvb2xlYW4gX3N0cmlwU3BlY2lhbEtleXdvcmRzOwotCi0gIHByaXZhdGUgYm9vbGVhbiBfc3RyaXBXaGl0ZXNwYWNlczsKLQotICAvL34tLS0gY29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgT2JmdXNjYXRvcihib29sZWFuIG9iZnVzY2F0ZSwgYm9vbGVhbiBzdHJpcENvbW1lbnRzLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0cmlwV2hpdGVzcGFjZXMsIGJvb2xlYW4gc3RyaXBOZXdsaW5lcywKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdHJpcFNwZWNpYWxLZXl3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlQ2hhckxpdGVyYWxzLCBPYmZ1c2NhdG9yQ29uZmlnIGNvbmZpZykKLSAgICB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlcigianMiLCBmYWxzZSk7Ci0gICAgX29iZnVzY2F0ZSA9IG9iZnVzY2F0ZTsKLSAgICBfc3RyaXBDb21tZW50cyA9IHN0cmlwQ29tbWVudHM7Ci0gICAgX3N0cmlwV2hpdGVzcGFjZXMgPSBzdHJpcFdoaXRlc3BhY2VzOwotICAgIF9zdHJpcE5ld2xpbmVzID0gc3RyaXBOZXdsaW5lczsKLSAgICBfc3RyaXBTcGVjaWFsS2V5d29yZHMgPSBzdHJpcFNwZWNpYWxLZXl3b3JkczsKLSAgICBfcmVwbGFjZUNoYXJMaXRlcmFscyA9IHJlcGxhY2VDaGFyTGl0ZXJhbHM7Ci0gICAgX2NvbmZpZyA9IGNvbmZpZzsKLSAgfQotCi0gIC8vfi0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHByaXZhdGUgdm9pZCBpbml0KElucHV0U291cmNlIGluKQotICB7Ci0KLSAgICAvLyBhcHBseSBvdmVycmlkZXMKLSAgICBib29sZWFuIG9iZnVzY2F0ZSA9IGluLnNraXBPYmZ1c2NhdGlvbigpPyBmYWxzZTogX29iZnVzY2F0ZTsKLSAgICBib29sZWFuIHN0cmlwQ29tbWVudHMgPSBpbi5za2lwU3RyaXBDb21tZW50cygpPyBmYWxzZTogX3N0cmlwQ29tbWVudHM7Ci0gICAgYm9vbGVhbiBzdHJpcFdoaXRlc3BhY2VzID0KLSAgICAgIGluLnNraXBTdHJpcFdoaXRlc3BhY2VzKCk/IGZhbHNlOiBfc3RyaXBXaGl0ZXNwYWNlczsKLSAgICBib29sZWFuIHN0cmlwTmV3TGluZXMgPSBpbi5za2lwU3RyaXBOZXdsaW5lcygpPyBmYWxzZTogX3N0cmlwTmV3bGluZXM7Ci0gICAgYm9vbGVhbiBzdHJpcFNwZWNpYWxLZXl3b3JkcyA9Ci0gICAgICBpbi5za2lwU3RyaXBTcGVjaWFsS2V5d29yZHMoKT8gZmFsc2U6IF9zdHJpcFNwZWNpYWxLZXl3b3JkczsKLQotICAgIC8vIHNldHVwIGZpbHRlcnMKLSAgICBfZmlsdGVycy5jbGVhcigpOwotCi0gICAgaWYgKHN0cmlwU3BlY2lhbEtleXdvcmRzKQotICAgIHsKLSAgICAgIF9maWx0ZXJzLmFkZChfa2V5d29yZHNGaWx0ZXIpOwotICAgIH0KLQotICAgIGlmIChzdHJpcFdoaXRlc3BhY2VzIHx8IHN0cmlwTmV3TGluZXMgfHwgc3RyaXBDb21tZW50cykKLSAgICB7Ci0gICAgICBfZmlsdGVycwotICAgICAgLmFkZChuZXcgQ29tcHJlc3Npb25GaWx0ZXIoc3RyaXBDb21tZW50cywgc3RyaXBXaGl0ZXNwYWNlcywgc3RyaXBOZXdMaW5lcykpOwotICAgIH0KLQotICAgIGlmIChvYmZ1c2NhdGUpCi0gICAgewotICAgICAgX2ZpbHRlcnMuYWRkKF9vYmZ1c2NhdGlvbkZpbHRlcik7Ci0gICAgfQotCi0gICAgLy8gbWFrZSBvdXRwdXQgZ2VuZXJhdG9yIHRoZSBsYXN0IGZpbHRlcgotICAgIF9maWx0ZXJzLmFkZChfb3V0cHV0R2VuZXJhdG9yKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0UGFyc2VyKElucHV0U3RyZWFtIGluKQotICB7Ci0gICAgaWYgKF9qc1BhcnNlciA9PSBudWxsKQotICAgIHsKLSAgICAgIF9qc1BhcnNlciA9IG5ldyBKU1BhcnNlcjE1KGluKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIF9qc1BhcnNlci5SZUluaXQoaW4pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoSW5wdXRTb3VyY2UgaW4sIE91dHB1dFN0cmVhbSBvdXQpCi0gICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gIHsKLSAgICBpbml0KGluKTsKLSAgICBfb3V0cHV0R2VuZXJhdG9yLnNldE91dHB1dFN0cmVhbShvdXQpOwotCi0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSB0b2tlbml6ZShpbi5nZXRJbnB1dFN0cmVhbSgpKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2ZpbHRlcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iZnVzY2F0b3JGaWx0ZXIgZmlsdGVyID0gKE9iZnVzY2F0b3JGaWx0ZXIpIGl0ci5uZXh0KCk7Ci0KLSAgICAgIHRva2VuID0gZmlsdGVyLmZpbHRlcih0b2tlbik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpbGUoRmlsZSBpbiwgRmlsZSBvdXQpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKF9vYmZ1c2NhdGUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGluKTsKLSAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0KTsKLSAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGluLmdldE5hbWUoKTsKLSAgICAgIElucHV0U291cmNlIGlucFNvdXJjZSA9Ci0gICAgICAgIG5ldyBJbnB1dFNvdXJjZShpblN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZy5za2lwT2JmdXNjYXRpb24oZmlsZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnLnNraXBTdHJpcENvbW1lbnRzKGZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZy5za2lwU3RyaXBXaGl0ZXNwYWNlcyhmaWxlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25maWcuc2tpcFN0cmlwTmV3bGluZXMoZmlsZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnLnNraXBTdHJpcFNwZWNpYWxLZXl3b3JkcyhmaWxlTmFtZSkpOwotCi0gICAgICBwcm9jZXNzKGlucFNvdXJjZSwgb3V0U3RyZWFtKTsKLSAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEp1c3QgY29weSB0aGUgZmlsZXMgb3Zlci4KLSAgICAgIEZpbGVVdGlscy50b3VjaChvdXQpOwotICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGluLG91dCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBBbm5vdGF0ZWRUb2tlbiB0b2tlbml6ZShJbnB1dFN0cmVhbSBpbikKLSAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgewotICAgIGluaXRQYXJzZXIoaW4pOwotCi0gICAgcmV0dXJuIChBbm5vdGF0ZWRUb2tlbikgX2pzUGFyc2VyLlByb2dyYW0oKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9Db25maWdFeGNlcHRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL0NvbmZpZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWY5NzMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL0NvbmZpZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5jb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlnRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIHB1YmxpYyBDb25maWdFeGNlcHRpb24oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgQ29uZmlnRXhjZXB0aW9uKFRocm93YWJsZSB0KQotICB7Ci0gICAgc3VwZXIodCk7Ci0gIH0KLQotICBwdWJsaWMgQ29uZmlnRXhjZXB0aW9uKFN0cmluZyBtc2cpCi0gIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9PYmZ1c2NhdG9yQ29uZmlnLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9PYmZ1c2NhdG9yQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzI4MmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vT2JmdXNjYXRvckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIE9iZnVzY2F0b3JDb25maWcKLXsKLSAgcHJpdmF0ZSBWZWN0b3IgX29iZkV4Y2x1c2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIF9jb21tZW50c0V4Y2x1c2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIF93c0V4Y2x1c2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIF9ubEV4Y2x1c2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIF9rZXl3b3JkRXhjbHVzaW9ucyA9IG5ldyBWZWN0b3IoKTsKLQotICBwdWJsaWMgT2JmdXNjYXRvckNvbmZpZygpIHRocm93cyBDb25maWdFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcE9iZnVzY2F0aW9uKFN0cmluZyBmaWxlKQotICB7Ci0gICAgcmV0dXJuIF9vYmZFeGNsdXNpb25zLmNvbnRhaW5zKGZpbGUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwQ29tbWVudHMoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICByZXR1cm4gX2NvbW1lbnRzRXhjbHVzaW9ucy5jb250YWlucyhmaWxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcFdoaXRlc3BhY2VzKFN0cmluZyBmaWxlKQotICB7Ci0gICAgcmV0dXJuIF93c0V4Y2x1c2lvbnMuY29udGFpbnMoZmlsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBOZXdsaW5lcyhTdHJpbmcgZmlsZSkKLSAgewotICAgIHJldHVybiBfbmxFeGNsdXNpb25zLmNvbnRhaW5zKGZpbGUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzKFN0cmluZyBmaWxlKQotICB7Ci0gICAgcmV0dXJuIF9rZXl3b3JkRXhjbHVzaW9ucy5jb250YWlucyhmaWxlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbgotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL2NvbmZpZy54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFmNjZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL2NvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ3aW5kb3dzLTEyNTIiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPG9iZnVzY2F0b3I+DQotICA8aW5wdXQ+DQotICAgIDxleGNsdXNpb25zPg0KLSAgICAgIDxvYmZ1c2NhdGlvbj4NCi0gICAgICA8L29iZnVzY2F0aW9uPg0KLSAgICAgIDxjb21tZW50cz4NCi0gICAgICA8L2NvbW1lbnRzPg0KLSAgICAgIDx3aGl0ZXNwYWNlcz4NCi0gICAgICA8L3doaXRlc3BhY2VzPg0KLSAgICAgIDxuZXdsaW5lcz4NCi0gICAgICA8L25ld2xpbmVzPg0KLSAgICAgIDxzcGVjaWFsa2V5d29yZHM+DQotICAgICAgICA8ZmlsZT5Bc3NlcnQuanM8L2ZpbGU+DQotICAgICAgICA8ZmlsZT5Mb2dnZXIuanM8L2ZpbGU+ICAgICAgDQotICAgICAgPC9zcGVjaWFsa2V5d29yZHM+DQotICAgIDwvZXhjbHVzaW9ucz4NCi0gIDwvaW5wdXQ+DQotPC9vYmZ1c2NhdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL09iZnVzY2F0b3JGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL09iZnVzY2F0b3JGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyNzQwMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9PYmZ1c2NhdG9yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci0KLQotcHVibGljIGludGVyZmFjZSBPYmZ1c2NhdG9yRmlsdGVyCi17Ci0gIEFubm90YXRlZFRva2VuIGZpbHRlcihBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbW1lbnRzSGFuZGxlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tbWVudHNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjEzMTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tbWVudHNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuY29tcHJlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci0KLQotcHVibGljIGNsYXNzIENvbW1lbnRzSGFuZGxlciBpbXBsZW1lbnRzIENvbXByZXNzaW9uSGFuZGxlcgotewotICBwdWJsaWMgQ29tbWVudHNIYW5kbGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlKEFubm90YXRlZFRva2VuIHRva2VuLCBBbm5vdGF0ZWRUb2tlbiBwcmV2VG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiBzcGVjaWFsVG9rZW4gPSB0b2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICBBbm5vdGF0ZWRUb2tlbiBwcmV2U3BlY2lhbFRva2VuID0gdG9rZW47Ci0KLSAgICB3aGlsZSAoc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gcmVtb3ZlIHNpbmdsZSBsaW5lIGFuZCBtdWx0aWxpbmUgY29tbWVudHMKLSAgICAgIGlmIChzcGVjaWFsVG9rZW4uaXNDb21tZW50KCkpCi0gICAgICB7Ci0gICAgICAgIHByZXZTcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbjsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmV2U3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21wcmVzc2lvbkZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tcHJlc3Npb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3NWE0Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21wcmVzc2lvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmNvbXByZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5PYmZ1c2NhdG9yRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wcmVzc2lvbkZpbHRlciBpbXBsZW1lbnRzIE9iZnVzY2F0b3JGaWx0ZXIKLXsKLSAgcHJpdmF0ZSBib29sZWFuIF9zdHJpcENvbW1lbnRzOwotICBwcml2YXRlIGJvb2xlYW4gX3N0cmlwV2hpdGVzcGFjZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBfc3RyaXBOZXdsaW5lczsKLSAgcHJpdmF0ZSBWZWN0b3IgX2hhbmRsZXJzID0gbmV3IFZlY3RvcigpOwotCi0gIHB1YmxpYyBDb21wcmVzc2lvbkZpbHRlcihib29sZWFuIHN0cmlwQ29tbWVudHMsIGJvb2xlYW4gc3RyaXBXaGl0ZXNwYWNlcywKLSAgICBib29sZWFuIHN0cmlwTmV3bGluZXMpCi0gIHsKLSAgICBfc3RyaXBDb21tZW50cyA9IHN0cmlwQ29tbWVudHM7Ci0gICAgX3N0cmlwV2hpdGVzcGFjZXMgPSBzdHJpcFdoaXRlc3BhY2VzOwotICAgIF9zdHJpcE5ld2xpbmVzID0gc3RyaXBOZXdsaW5lczsKLQotICAgIC8vIGNyZWF0ZSBhIHNldCBvZiBoYW5kbGVycyBiYXNlZCBvbiBzdXBwbGllZCBvcHRpb25zCi0gICAgaW5pdCgpOwotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGZpbHRlcihBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwotICAgIEFubm90YXRlZFRva2VuIHByZXZUb2tlbiA9IG51bGw7Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBoYW5kIG9mZiB0byBoYW5kbGVycwotICAgICAgLy8gdG9kbzogaW5saW5lIHRoZXNlIGlmIHRoaXMgaXMgdG9vIGV4cGVuc2l2ZQotICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfaGFuZGxlcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIENvbXByZXNzaW9uSGFuZGxlciBoYW5kbGVyID0gKENvbXByZXNzaW9uSGFuZGxlcikgaXRyLm5leHQoKTsKLSAgICAgICAgaGFuZGxlci5oYW5kbGUodG9rZW4sIHByZXZUb2tlbik7Ci0gICAgICB9Ci0KLSAgICAgIHByZXZUb2tlbiA9IHRva2VuOwotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXJ0VG9rZW47Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBpZiAoX3N0cmlwQ29tbWVudHMpCi0gICAgewotICAgICAgX2hhbmRsZXJzLmFkZChuZXcgQ29tbWVudHNIYW5kbGVyKCkpOwotICAgIH0KLQotICAgIGlmIChfc3RyaXBXaGl0ZXNwYWNlcykKLSAgICB7Ci0gICAgICBfaGFuZGxlcnMuYWRkKG5ldyBXaGl0ZXNwYWNlSGFuZGxlcigpKTsKLSAgICB9Ci0KLSAgICBpZiAoX3N0cmlwTmV3bGluZXMpCi0gICAgewotICAgICAgX2hhbmRsZXJzLmFkZChuZXcgTmV3bGluZUhhbmRsZXIoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21wcmVzc2lvbkhhbmRsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbXByZXNzaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjBiYTM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbXByZXNzaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmNvbXByZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcHJlc3Npb25IYW5kbGVyCi17Ci0gIHZvaWQgaGFuZGxlKEFubm90YXRlZFRva2VuIHRva2VuLCBBbm5vdGF0ZWRUb2tlbiBwcmV2VG9rZW4pOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vTmV3bGluZUhhbmRsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL05ld2xpbmVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjJiZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vTmV3bGluZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5jb21wcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLQotCi1wdWJsaWMgY2xhc3MgTmV3bGluZUhhbmRsZXIgaW1wbGVtZW50cyBDb21wcmVzc2lvbkhhbmRsZXIKLXsKLSAgcHVibGljIE5ld2xpbmVIYW5kbGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlKEFubm90YXRlZFRva2VuIHRva2VuLCBBbm5vdGF0ZWRUb2tlbiBwcmV2VG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiBzcGVjaWFsVG9rZW4gPSB0b2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICBBbm5vdGF0ZWRUb2tlbiBwcmV2U3BlY2lhbFRva2VuID0gdG9rZW47Ci0gICAgYm9vbGVhbiBza2lwT25lID0gKHByZXZUb2tlbiA9PSBudWxsKSA/IGZhbHNlIDogdHJ1ZTsKLQotICAgIHdoaWxlIChzcGVjaWFsVG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoc3BlY2lhbFRva2VuLmlzTmV3TGluZSgpKQotICAgICAgewotICAgICAgICBpZiAoc2tpcE9uZSkKLSAgICAgICAgewotICAgICAgICAgIHNraXBPbmUgPSBmYWxzZTsKLSAgICAgICAgICBzcGVjaWFsVG9rZW4uaW1hZ2UgPSAiXHJcbiI7Ci0gICAgICAgICAgcHJldlNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcHJldlNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmV2U3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9XaGl0ZXNwYWNlSGFuZGxlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vV2hpdGVzcGFjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2YjgzOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9XaGl0ZXNwYWNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmNvbXByZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotCi0KLXB1YmxpYyBjbGFzcyBXaGl0ZXNwYWNlSGFuZGxlciBpbXBsZW1lbnRzIENvbXByZXNzaW9uSGFuZGxlcgotewotICBwdWJsaWMgV2hpdGVzcGFjZUhhbmRsZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGUoQW5ub3RhdGVkVG9rZW4gdG9rZW4sIEFubm90YXRlZFRva2VuIHByZXZUb2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHNwZWNpYWxUb2tlbiA9IHRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgIEFubm90YXRlZFRva2VuIHByZXZTcGVjaWFsVG9rZW4gPSB0b2tlbjsKLSAgICBib29sZWFuIHNraXBPbmUgPSAocHJldlRva2VuID09IG51bGwpID8gZmFsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHByZXZUb2tlbi5pc1dTU2Vuc2l0aXZlKCkgfHwKLSAgICAgIHRva2VuLmlzSW5maXhXU1NlbnNpdGl2ZSgpKTsKLQotICAgIHdoaWxlIChzcGVjaWFsVG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyByZW1vdmUgd2hpdGVzcGFjZS4gS2VlcCBvbmUgaWYgdGhlIHRva2VuIGlzIHdoaXRlc3BhY2Ugc2Vuc2l0aXZlCi0gICAgICBpZiAoc3BlY2lhbFRva2VuLmlzV2hpdGVTcGFjZSgpKQotICAgICAgewotICAgICAgICBpZiAoc2tpcE9uZSkKLSAgICAgICAgewotICAgICAgICAgIHNraXBPbmUgPSBmYWxzZTsKLSAgICAgICAgICBzcGVjaWFsVG9rZW4uaW1hZ2UgPSAiICI7Ci0gICAgICAgICAgcHJldlNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcHJldlNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmV2U3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9rZXl3b3Jkcy9TcGVjaWFsS2V5d29yZHNGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2tleXdvcmRzL1NwZWNpYWxLZXl3b3Jkc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTljMDUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2tleXdvcmRzL1NwZWNpYWxLZXl3b3Jkc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5rZXl3b3JkczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuT2JmdXNjYXRvckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci0KLQotcHVibGljIGNsYXNzIFNwZWNpYWxLZXl3b3Jkc0ZpbHRlciBpbXBsZW1lbnRzIE9iZnVzY2F0b3JGaWx0ZXIKLXsKLSAgcHVibGljIFNwZWNpYWxLZXl3b3Jkc0ZpbHRlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBmaWx0ZXIoQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnRUb2tlbjsKLSAgICB0b2tlbiA9IHJlbW92ZVNwZWNpYWxUeXBlcyh0b2tlbik7Ci0KLSAgICByZXR1cm4gdG9rZW47Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWFsVG9rZW5zKEFubm90YXRlZFRva2VuIHRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gc3BlY2lhbFRva2VuID0gdG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgQW5ub3RhdGVkVG9rZW4gcHJldlNwZWNpYWxUb2tlbiA9IHRva2VuOwotCi0gICAgd2hpbGUgKHNwZWNpYWxUb2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChzcGVjaWFsVG9rZW4uaXNSZW1vdmFibGVLZXl3b3JkKCkpCi0gICAgICB7Ci0gICAgICAgIHByZXZTcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbjsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmV2U3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtYWluIGxvb3AgcmVtb3ZlcyBzcGVjaWFsIHR5cGVzIChsaWtlIFByb2ZpbGVyLCBhbmQgQ2hlY2tQb2ludCkgYW5kCi0gICAqIGFsbCBtZXRob2QgaW52b2NhdGlvbnMgdXNpbmcgdmFyaWFibGVzIG9mIHRoZXNlIHR5cGVzLiBUaGUgbWFpbgotICAgKiBsb29wIGNhbGxzIHJlbW92ZVNwZWNpYWxUb2tlbnMgd2hpY2ggcmVtb3ZlcyBzcGVjaWFsIGtleXdvcmRzIGxpa2UgQXNzZXJ0Ci0gICAqIGFuZCBMb2dnZXIsIHdoaWNoIHdlcmUgdGFnZ2VkIGJ5IHRoZSBwYXJzZXIgYXMgU3BlY2lhbFRva2VucwotICAgKiBAcGFyYW0gc3RhcnRUb2tlbgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcm90ZWN0ZWQgQW5ub3RhdGVkVG9rZW4gcmVtb3ZlU3BlY2lhbFR5cGVzKEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47Ci0gICAgQW5ub3RhdGVkVG9rZW4gcHJldlRva2VuID0gbnVsbDsKLSAgICBBbm5vdGF0ZWRUb2tlbiBuZXdTdGFydFRva2VuID0gbnVsbDsKLQotICAgIHdoaWxlICh0b2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh0b2tlbi5jYW5SZW1vdmUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByZXZUb2tlbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcHJldlRva2VuLm5leHQgPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVtb3ZlU3BlY2lhbFRva2Vucyh0b2tlbik7Ci0KLSAgICAgICAgaWYgKG5ld1N0YXJ0VG9rZW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG5ld1N0YXJ0VG9rZW4gPSB0b2tlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZUb2tlbiA9IHRva2VuOwotICAgICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3U3RhcnRUb2tlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vT2JmdXNjYXRpb25GaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL09iZnVzY2F0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTA3MzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vT2JmdXNjYXRpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuT2JmdXNjYXRvckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uLnN0YXRlLlJvb3RTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0U3RhY2s7Ci0KLQotcHVibGljIGNsYXNzIE9iZnVzY2F0aW9uRmlsdGVyIGltcGxlbWVudHMgT2JmdXNjYXRvckZpbHRlcgotewotICBwdWJsaWMgT2JmdXNjYXRpb25GaWx0ZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZmlsdGVyKEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4pCi0gIHsKLSAgICBpZiAoc3RhcnRUb2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHRyYW5zaXRpb24gdG8gcm9vdCBzdGF0ZQotICAgICAgUHJvZ3JhbUNvbnRleHRTdGFjayBwcm9ncmFtQ29udGV4dFN0YWNrID0gbmV3IFByb2dyYW1Db250ZXh0U3RhY2soKTsKLSAgICAgIFJvb3RTdGF0ZS5nZXRJbnN0YW5jZSgpLmVudGVyU3RhdGUocHJvZ3JhbUNvbnRleHRTdGFjaywgc3RhcnRUb2tlbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXJ0VG9rZW47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL0Z1bmN0aW9uQ29udGV4dC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvRnVuY3Rpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOWExYzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvRnVuY3Rpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb24uc3RhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuTmFtZUdlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEZ1bmN0aW9uQ29udGV4dCBleHRlbmRzIFByb2dyYW1Db250ZXh0IHsKLSAgICBwcml2YXRlIGJvb2xlYW4gX29iZnVzY2F0ZUxvY2FsVmFyczsKLQotICAgIHB1YmxpYyBGdW5jdGlvbkNvbnRleHQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gb2JmdXNjYXRlTG9jYWxWYXJzKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBfb2JmdXNjYXRlTG9jYWxWYXJzID0gb2JmdXNjYXRlTG9jYWxWYXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBGdW5jdGlvbkNvbnRleHQoU3RyaW5nIG5hbWUsIE5hbWVHZW4gbmFtZUdlbiwgYm9vbGVhbiB1c2VzRXZhbCkgewotICAgICAgICBzdXBlcihuYW1lLCBuYW1lR2VuKTsKLSAgICAgICAgX29iZnVzY2F0ZUxvY2FsVmFycyA9IHVzZXNFdmFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9iZnVzY2F0ZUxvY2FsVmFycyhib29sZWFuIG9iZnVzY2F0ZUxvY2FsVmFycykgewotICAgICAgICBfb2JmdXNjYXRlTG9jYWxWYXJzID0gb2JmdXNjYXRlTG9jYWxWYXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbk9iZnVzY2F0ZUxvY2FsVmFycygpIHsKLSAgICAgICAgcmV0dXJuIF9vYmZ1c2NhdGVMb2NhbFZhcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvRnVuY3Rpb25TdGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvRnVuY3Rpb25TdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg5NTgyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL0Z1bmN0aW9uU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb24uc3RhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkpTUGFyc2VyMTVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLk5hbWVHZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dFN0YWNrOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIEZ1bmN0aW9uU3RhdGUgZXh0ZW5kcyBPYmZ1c2NhdGlvblN0YXRlCi17Ci0gIHN0YXRpYyBwcml2YXRlIEZ1bmN0aW9uU3RhdGUgX2luc3RhbmNlOwotCi0gIC8vIHByaXZhdGUgY29uc3RydW5jdG9yIGZvciBzaW5nbGV0b24KLSAgcHJpdmF0ZSBGdW5jdGlvblN0YXRlKCkKLSAgewotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBGdW5jdGlvblN0YXRlIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzeW5jaHJvbml6ZWQgKEZ1bmN0aW9uU3RhdGUuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIF9pbnN0YW5jZSA9IG5ldyBGdW5jdGlvblN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gX2luc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGVudGVyU3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbiwgTmFtZUdlbiBuYW1lR2VuKQotICB7Ci0gICAgRnVuY3Rpb25Db250ZXh0IGZ1bmN0aW9uQ29udGV4dDsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47Ci0gICAgU3RyaW5nIGNvbnRleHROYW1lID0gIkFub255bW91c0Z1bmN0aW9uIjsKLSAgICBWZWN0b3IgcGFyYW1zID0gKFZlY3RvcikgdG9rZW4uZ2V0QW5ub3RhdGlvbk9iamVjdCgpOwotICAgIGJvb2xlYW4gb2JmdXNjYXRlTG9jYWxWYXJzID0gIXRva2VuLmZ1bmN0aW9uVXNlc0V2YWwoKTsKLQotICAgIGlmICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5OQU1FRF9GVU5DVElPTikKLSAgICB7Ci0gICAgICAvLyBncmFiIHRoZSBmdW5jdGlvbiBuYW1lCi0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICAgIGNvbnRleHROYW1lID0gdG9rZW4uaW1hZ2U7Ci0gICAgICBmdW5jdGlvbkNvbnRleHQgPSBuZXcgRnVuY3Rpb25Db250ZXh0KGNvbnRleHROYW1lLCBvYmZ1c2NhdGVMb2NhbFZhcnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gcmV1c2UgdGhlIHN5bWJvbCBuYW1lIGdlbmVyYXRvciBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucwotICAgICAgZnVuY3Rpb25Db250ZXh0ID0gbmV3IEZ1bmN0aW9uQ29udGV4dChjb250ZXh0TmFtZSwgbmFtZUdlbiwKLSAgICAgICAgICBvYmZ1c2NhdGVMb2NhbFZhcnMpOwotICAgIH0KLQotICAgIGlmIChvYmZ1c2NhdGVMb2NhbFZhcnMpCi0gICAgewotICAgICAgb2JmdXNjYXRlRnVuY3Rpb25QYXJhbXMocGFyYW1zLCBmdW5jdGlvbkNvbnRleHQpOwotICAgIH0KLQotICAgIHdoaWxlICh0b2tlbi5raW5kICE9IEpTUGFyc2VyMTVDb25zdGFudHMuTEJSQUNFKQotICAgIHsKLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIGNvbnRleHRTdGFjay5wdXNoQ29udGV4dChmdW5jdGlvbkNvbnRleHQpOwotCi0gICAgcmV0dXJuIHByb2Nlc3NDb2RlQmxvY2soY29udGV4dFN0YWNrLCB0b2tlbik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgb2JmdXNjYXRlRnVuY3Rpb25QYXJhbXMoVmVjdG9yIHBhcmFtcywKLSAgICBQcm9ncmFtQ29udGV4dCBmdW5jdGlvbkNvbnRleHQpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHBhcmFtcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBBbm5vdGF0ZWRUb2tlbiBwYXJhbVRva2VuID0gKEFubm90YXRlZFRva2VuKSBpdHIubmV4dCgpOwotICAgICAgZnVuY3Rpb25Db250ZXh0LmFkZFRva2VuKHBhcmFtVG9rZW4uaW1hZ2UsIHBhcmFtVG9rZW4pOwotICAgICAgcGFyYW1Ub2tlbi5pbWFnZSA9IGZ1bmN0aW9uQ29udGV4dC5nZW5lcmF0ZVN5bWJvbE5hbWUoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGl0U3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2spCi0gIHsKLSAgICBjb250ZXh0U3RhY2sucG9wQ29udGV4dCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhcklkZW50aWZpZXIoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4pCi0gIHsKLSAgICBGdW5jdGlvbkNvbnRleHQgZnVuY3Rpb25Db250ZXh0ID0gKEZ1bmN0aW9uQ29udGV4dCkgY29udGV4dFN0YWNrLnBlZWsoKTsKLQotICAgIC8vIG5vcm1hbCBwcm9jZXNzaW5nIGZvciBmdW5jdGlvbnMgdGhhdCBkbyBub3QgdXNlIGV2YWwoKSBjYWxscwotICAgIGlmIChmdW5jdGlvbkNvbnRleHQuY2FuT2JmdXNjYXRlTG9jYWxWYXJzKCkpCi0gICAgewotICAgICAgc3VwZXIucHJvY2Vzc1ZhcklkZW50aWZpZXIoY29udGV4dFN0YWNrLCB0b2tlbik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9PYmZ1c2NhdGlvblN0YXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9PYmZ1c2NhdGlvblN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTE2YzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvT2JmdXNjYXRpb25TdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbi5zdGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuSlNQYXJzZXIxNUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuTmFtZUdlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0U3RhY2s7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE9iZnVzY2F0aW9uU3RhdGUKLXsKLSAgcHVibGljIGFic3RyYWN0IEFubm90YXRlZFRva2VuIGVudGVyU3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbiwgTmFtZUdlbiBuYW1lR2VuKTsKLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGl0U3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2spOwotCi0gIC8qKgotICAqIE9iZnVzY2F0ZXMgdmFyaWFibGUgZGVjbGFyYXRpb25zCi0gICogQHBhcmFtIGNvbnRleHRTdGFjawotICAqIEBwYXJhbSB0b2tlbgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFySWRlbnRpZmllcihQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbikKLSAgewotICAgIFByb2dyYW1Db250ZXh0IGJsb2NrQ29udGV4dCA9IChQcm9ncmFtQ29udGV4dCkgY29udGV4dFN0YWNrLnBlZWsoKTsKLQotICAgIC8vIHNraXAgZ2xvYmFsIHZhcnMKLSAgICBpZiAoY29udGV4dFN0YWNrLnNpemUoKSA+IDEpCi0gICAgewotICAgICAgLy8gYWRkIG9ubHkgaWYgd2UgaGF2ZSBub3Qgc2VlbiB0aGlzIHZhcmlhYmxlIGJlZm9yZSBpbiB0aGlzIGNvbnRleHQuCi0gICAgICBBbm5vdGF0ZWRUb2tlbiBzYXZlZFRva2VuID0gYmxvY2tDb250ZXh0LmdldFRva2VuKHRva2VuLmltYWdlKTsKLSAgICAgIFN0cmluZyB0b2tlbkltYWdlOwotCi0gICAgICBpZiAoc2F2ZWRUb2tlbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB0b2tlbkltYWdlID0gYmxvY2tDb250ZXh0LmdlbmVyYXRlU3ltYm9sTmFtZSgpOwotICAgICAgICBibG9ja0NvbnRleHQuYWRkVG9rZW4odG9rZW4uaW1hZ2UsIHRva2VuKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdG9rZW5JbWFnZSA9IHNhdmVkVG9rZW4uaW1hZ2U7Ci0gICAgICB9Ci0KLSAgICAgIHRva2VuLmltYWdlID0gdG9rZW5JbWFnZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKgotICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgKiBAcGFyYW0gc3RhcnRUb2tlbgotICAqIEByZXR1cm4KLSAgKi8KLSAgcHVibGljIEFubm90YXRlZFRva2VuIHByb2Nlc3NDb2RlQmxvY2soUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbikKLSAgewotICAgIC8vIGdyYWIgdGhlIGNvbnRleHQgb24gdG9wIG9mIHRoZSBzdGFjawotICAgIFByb2dyYW1Db250ZXh0IGJsb2NrQ29udGV4dCA9IChQcm9ncmFtQ29udGV4dCkgY29udGV4dFN0YWNrLnBlZWsoKTsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRva2VuLmdldEtpbmQoKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgQW5ub3RhdGlvbkNvbnN0YW50cy5OQU1FRF9GVU5DVElPTjoKLSAgICAgIGNhc2UgQW5ub3RhdGlvbkNvbnN0YW50cy5BTk9OWU1PVVNfRlVOQ1RJT046Ci0gICAgICAgIHRva2VuID0gRnVuY3Rpb25TdGF0ZS5nZXRJbnN0YW5jZSgpLmVudGVyU3RhdGUoY29udGV4dFN0YWNrLCB0b2tlbiwKLSAgICAgICAgICAgIGJsb2NrQ29udGV4dC5nZXROYW1lR2VuKCkpOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFubm90YXRpb25Db25zdGFudHMuVkFSX0lERU5USUZJRVI6Ci0gICAgICB7Ci0gICAgICAgIHByb2Nlc3NWYXJJZGVudGlmaWVyKGNvbnRleHRTdGFjaywgdG9rZW4pOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEpTUGFyc2VyMTVDb25zdGFudHMuSURFTlRJRklFUjoKLSAgICAgIGNhc2UgQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfSURFTlRJRklFUjoKLQotICAgICAgICBBbm5vdGF0ZWRUb2tlbiBvYmZ1c2NhdGVkVG9rZW4gPSBjb250ZXh0U3RhY2suZ2V0VG9rZW4odG9rZW4uaW1hZ2UpOwotCi0gICAgICAgIGlmIChvYmZ1c2NhdGVkVG9rZW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRva2VuLmltYWdlID0gb2JmdXNjYXRlZFRva2VuLmltYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSlNQYXJzZXIxNUNvbnN0YW50cy5MQlJBQ0U6Ci0gICAgICAgIHRva2VuID0gU3RhdGVtZW50QmxvY2tTdGF0ZS5nZXRJbnN0YW5jZSgpLmVudGVyU3RhdGUoY29udGV4dFN0YWNrLAotICAgICAgICAgICAgdG9rZW4sIGJsb2NrQ29udGV4dC5nZXROYW1lR2VuKCkpOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEpTUGFyc2VyMTVDb25zdGFudHMuUkJSQUNFOgotICAgICAgICBleGl0U3RhdGUoY29udGV4dFN0YWNrKTsKLQotICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgICB9Ci0KLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIHJldHVybiB0b2tlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvUm9vdFN0YXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9Sb290U3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwODJjNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9Sb290U3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbi5zdGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuTmFtZUdlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0U3RhY2s7Ci0KLQotcHVibGljIGNsYXNzIFJvb3RTdGF0ZSBleHRlbmRzIE9iZnVzY2F0aW9uU3RhdGUKLXsKLSAgc3RhdGljIHByaXZhdGUgUm9vdFN0YXRlIF9pbnN0YW5jZTsKLQotICAvLyBwcml2YXRlIGNvbnN0cnVuY3RvciBmb3Igc2luZ2xldG9uCi0gIHByaXZhdGUgUm9vdFN0YXRlKCkKLSAgewotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBSb290U3RhdGUgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN5bmNocm9uaXplZCAoUm9vdFN0YXRlLmNsYXNzKQotICAgICAgewotICAgICAgICBpZiAoX2luc3RhbmNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBfaW5zdGFuY2UgPSBuZXcgUm9vdFN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gX2luc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGVudGVyU3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbiwgTmFtZUdlbiBuYW1lR2VuKQotICB7Ci0gICAgY29udGV4dFN0YWNrLnB1c2hDb250ZXh0KG5ldyBQcm9ncmFtQ29udGV4dCgicm9vdCIpKTsKLQotICAgIHJldHVybiBwcm9jZXNzQ29kZUJsb2NrKGNvbnRleHRTdGFjaywgc3RhcnRUb2tlbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGl0U3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2spCi0gIHsKLSAgICBjb250ZXh0U3RhY2sucG9wQ29udGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9TdGF0ZW1lbnRCbG9ja1N0YXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9TdGF0ZW1lbnRCbG9ja1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjdiZmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvU3RhdGVtZW50QmxvY2tTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uLnN0YXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5OYW1lR2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHRTdGFjazsKLQotCi1wdWJsaWMgY2xhc3MgU3RhdGVtZW50QmxvY2tTdGF0ZSBleHRlbmRzIE9iZnVzY2F0aW9uU3RhdGUKLXsKLSAgc3RhdGljIHByaXZhdGUgU3RhdGVtZW50QmxvY2tTdGF0ZSBfaW5zdGFuY2U7Ci0KLSAgcHJpdmF0ZSBTdGF0ZW1lbnRCbG9ja1N0YXRlKCkKLSAgewotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdGF0ZW1lbnRCbG9ja1N0YXRlIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzeW5jaHJvbml6ZWQgKFN0YXRlbWVudEJsb2NrU3RhdGUuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIF9pbnN0YW5jZSA9IG5ldyBTdGF0ZW1lbnRCbG9ja1N0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gX2luc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGVudGVyU3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbiwgTmFtZUdlbiBuYW1lR2VuKQotICB7Ci0gICAgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBjb250ZXh0IGluIGEgc3RhdGVtZW50IGJsb2NrLiBKYXZhU2NyaXB0IGRvZXMgbm90IHVzZSBhIG5ldyBzY29wZSBpbiBhCi0gICAgLy8gc3RhdGVtZW50IGJsb2NrCi0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuLmdldE5leHQoKTsKLQotICAgIHJldHVybiBwcm9jZXNzQ29kZUJsb2NrKGNvbnRleHRTdGFjaywgdG9rZW4pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhpdFN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrKQotICB7Ci0gICAgLy8gZG8gbm90IHBvcCBjb250ZXh0Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFySWRlbnRpZmllcihQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbikKLSAgewotICAgIFByb2dyYW1Db250ZXh0IGJsb2NrQ29udGV4dCA9IChQcm9ncmFtQ29udGV4dCkgY29udGV4dFN0YWNrLnBlZWsoKTsKLQotICAgIC8vIG5vcm1hbCBwcm9jZXNzaW5nIGZvciBmdW5jdGlvbnMgdGhhdCBkbyBub3QgdXNlIGV2YWwoKSBjYWxscwotICAgIGlmICghKGJsb2NrQ29udGV4dCBpbnN0YW5jZW9mIEZ1bmN0aW9uQ29udGV4dCkgfHwKLSAgICAgICAgKGJsb2NrQ29udGV4dCBpbnN0YW5jZW9mIEZ1bmN0aW9uQ29udGV4dCAmJgotICAgICAgICAoKEZ1bmN0aW9uQ29udGV4dCkgYmxvY2tDb250ZXh0KS5jYW5PYmZ1c2NhdGVMb2NhbFZhcnMoKSkpCi0gICAgewotICAgICAgc3VwZXIucHJvY2Vzc1ZhcklkZW50aWZpZXIoY29udGV4dFN0YWNrLCB0b2tlbik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vdXRwdXQvT3V0cHV0R2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vdXRwdXQvT3V0cHV0R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOTI2OGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb3V0cHV0L091dHB1dEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm91dHB1dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuT2JmdXNjYXRvckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlRva2VuOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBPdXRwdXRHZW5lcmF0b3IgaW1wbGVtZW50cyBPYmZ1c2NhdG9yRmlsdGVyCi17Ci0gIHByaXZhdGUgUHJpbnRTdHJlYW0gX291dFN0cmVhbTsKLQotICBwdWJsaWMgT3V0cHV0R2VuZXJhdG9yKCkKLSAgewotICB9Ci0KLSAgcHVibGljIE91dHB1dEdlbmVyYXRvcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKQotICB7Ci0gICAgX291dFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKSk7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZmlsdGVyKEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcmludFRva2VuKHRva2VuKTsKLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIF9vdXRTdHJlYW0uZmx1c2goKTsKLQotICAgIHJldHVybiBzdGFydFRva2VuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXRTdHJlYW0pCi0gIHsKLSAgICBfb3V0U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRTdHJlYW0pKTsKLSAgfQotCi0gIHB1YmxpYyBQcmludFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQotICB7Ci0gICAgcmV0dXJuIF9vdXRTdHJlYW07Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJpbnRUb2tlbihUb2tlbiB0b2tlbikKLSAgewotICAgIC8vIHByaW50IHNwZWNpYWwgdG9rZW5zIGZpcnN0Ci0gICAgaWYgKHRva2VuLnNwZWNpYWxUb2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHByaW50VG9rZW4odG9rZW4uc3BlY2lhbFRva2VuKTsKLSAgICB9Ci0KLSAgICBfb3V0U3RyZWFtLnByaW50KHRva2VuLmltYWdlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Bbm5vdGF0ZWRUb2tlbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Bbm5vdGF0ZWRUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM0MzI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvQW5ub3RhdGVkVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0ZWRUb2tlbiBleHRlbmRzIFRva2VuIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZlY3RvciBTUEVDSUFMX1RZUEVTID0gbmV3IFZlY3RvcigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgU1BFQ0lBTF9UWVBFUy5hZGQoIlByb2ZpbGVyIik7Ci0gICAgICAgIFNQRUNJQUxfVFlQRVMuYWRkKCJDaGVja3BvaW50Iik7Ci0gICAgICAgIFNQRUNJQUxfVFlQRVMuYWRkKCJBc3NlcnQiKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFUy5hZGQoIkxvZ2dlciIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGSVhfV1MgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklYX1dTID0gMjsKLQotICAgIHByb3RlY3RlZCBpbnQgX2Fubm90YXRpb25LaW5kID0gQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQ7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBfYW5ub3RhdGlvbk9iamVjdDsKLSAgICBwcm90ZWN0ZWQgaW50IF93c1NlbnNpdGl2ZSA9IDA7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3JlbW92ZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfZnVuY1VzZXNFdmFsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgX3R5cGUgPSAidW5kZWZpbmVkIjsKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIF9wcm9kdWN0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4oaW50IGFubm90YXRpb25LaW5kLCBPYmplY3QgYW5ub3RhdGlvbk9iamVjdCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBfYW5ub3RhdGlvbktpbmQgPSBhbm5vdGF0aW9uS2luZDsKLSAgICAgICAgX2Fubm90YXRpb25PYmplY3QgPSBhbm5vdGF0aW9uT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25LaW5kKGludCBhbm5vdGF0aW9uS2luZCkgewotICAgICAgICBfYW5ub3RhdGlvbktpbmQgPSBhbm5vdGF0aW9uS2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEFubm90YXRpb25LaW5kKCkgewotICAgICAgICByZXR1cm4gX2Fubm90YXRpb25LaW5kOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLSAgICAgICAgaWYgKF9hbm5vdGF0aW9uS2luZCAhPSBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCkgewotICAgICAgICAgICAgcmV0dXJuIF9hbm5vdGF0aW9uS2luZDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBraW5kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25PYmplY3QoT2JqZWN0IGFubm90YXRpb25PYmplY3QpIHsKLSAgICAgICAgX2Fubm90YXRpb25PYmplY3QgPSBhbm5vdGF0aW9uT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QW5ub3RhdGlvbk9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIF9hbm5vdGF0aW9uT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBnZXROZXh0KCkgewotICAgICAgICByZXR1cm4gKEFubm90YXRlZFRva2VuKW5leHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFubm90YXRlZFRva2VuIGdldFNwZWNpYWxUb2tlbigpIHsKLSAgICAgICAgcmV0dXJuIChBbm5vdGF0ZWRUb2tlbilzcGVjaWFsVG9rZW47Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gKGtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5XUyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lKCkgewotICAgICAgICByZXR1cm4gKGtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5FT0wpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKLSAgICAgICAgcmV0dXJuICgoa2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLlNJTkdMRV9MSU5FX0NPTU1FTlQpIHx8Ci0gICAgICAgICAgICAgICAgKGtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5NVUxUSV9MSU5FX0NPTU1FTlQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dTU2Vuc2l0aXZlKCkgewotICAgICAgICByZXR1cm4gX3dzU2Vuc2l0aXZlICE9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NTZW5zaXRpdmUoaW50IGkpIHsKLSAgICAgICAgX3dzU2Vuc2l0aXZlID0gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZWZpeFdTU2Vuc2l0aXZlKCkgewotICAgICAgICByZXR1cm4gX3dzU2Vuc2l0aXZlID09IFBSRUZJWF9XUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luZml4V1NTZW5zaXRpdmUoKSB7Ci0gICAgICAgIHJldHVybiBfd3NTZW5zaXRpdmUgPT0gSU5GSVhfV1M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZW1vdmFibGVLZXl3b3JkKCkgewotICAgICAgICBib29sZWFuIGlzUmVtb3ZhYmxlID0gZmFsc2U7Ci0KLSAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vICAgICAgY2FzZSBKU1BhcnNlcjE0Q29uc3RhbnRzLkFTU0VSVF9TVEFURU1FTlQ6Ci0gICAgICAgICAgICAvLyAgICAgIGNhc2UgSlNQYXJzZXIxNENvbnN0YW50cy5MT0dHRVJfU1RBVEVNRU5UOgotICAgICAgICAgICAgLy8gICAgICAgIGlzUmVtb3ZhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc1JlbW92YWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NwZWNpYWxDbGFzc1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTUEVDSUFMX1RZUEVTLmNvbnRhaW5zKGltYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NwZWNpYWxPYmplY3RUeXBlKCkgewotICAgICAgICByZXR1cm4gU1BFQ0lBTF9UWVBFUy5jb250YWlucyhfdHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgX3JlbW92ZS4KLSAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKCkgewotICAgICAgICByZXR1cm4gX3JlbW92ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICogQHBhcmFtIF9yZW1vdmUgVGhlIF9yZW1vdmUgdG8gc2V0LgotICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmFibGUoYm9vbGVhbiByZW1vdmUpIHsKLSAgICAgICAgdGhpcy5fcmVtb3ZlID0gcmVtb3ZlOwotICAgIH0KLQotICAgIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIF90eXBlLgotICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBfdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICogQHBhcmFtIF90eXBlIFRoZSBfdHlwZSB0byBzZXQuCi0gICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVuY3Rpb25Vc2VzRXZhbChib29sZWFuIHVzZXNFdmFsKSB7Ci0gICAgICAgIF9mdW5jVXNlc0V2YWwgPSB1c2VzRXZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmdW5jdGlvblVzZXNFdmFsKCkgewotICAgICAgICByZXR1cm4gX2Z1bmNVc2VzRXZhbDsKLSAgICB9Ci0KLSAgICAvLyAgICBwdWJsaWMgdm9pZCBhZGRQcm9kdWN0aW9uKFNpbXBsZU5vZGUgbm9kZSkgewotICAgIC8vICAgICAgICBfcHJvZHVjdGlvbnMuYWRkKG5vZGUpOwotICAgIC8vICAgIH0KLQotICAgIHB1YmxpYyBWZWN0b3IgZ2V0UHJvZHVjdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBfcHJvZHVjdGlvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Bbm5vdGF0aW9uQ29uc3RhbnRzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0Fubm90YXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2YjUyZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0Fubm90YXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25Db25zdGFudHMgewotICAgIGludCBVTkRFRklORUQgPSAtOTk5OwotICAgIGludCBWQVJfSURFTlRJRklFUiA9IC0xOwotICAgIGludCBGVU5DVElPTl9OQU1FX0lERU5USUZJRVIgPSAtMjsKLSAgICBpbnQgRlVOQ1RJT05fUEFSQU1fSURFTlRJRklFUiA9IC0zOwotICAgIGludCBMSVRFUkFMX09CSkVDVF9LRVlfSURFTlRJRklFUiA9IC00OwotICAgIGludCBPQkpFQ1RfSURFTlRJRklFUiA9IC01OwotICAgIGludCBPQkpFQ1RfRklFTERfSURFTlRJRklFUiA9IC02OwotICAgIGludCBPQkpFQ1RfTUVUSE9EX0lERU5USUZJRVIgPSAtNzsKLSAgICBpbnQgTkFNRURfRlVOQ1RJT04gPSAtODsKLSAgICBpbnQgQU5PTllNT1VTX0ZVTkNUSU9OID0gLTk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9KU1BhcnNlclRlc3QxNS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9KU1BhcnNlclRlc3QxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzdjMWQzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvSlNQYXJzZXJUZXN0MTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEpTUGFyc2VyVGVzdDE1Ci17Ci0gIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBfaW47Ci0KLSAgcHVibGljIEpTUGFyc2VyVGVzdDE1KElucHV0U3RyZWFtIGluKQotICB7Ci0gICAgX2luID0gaW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydCgpCi0gIHsKLSAgICAvLyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHBhcnNlcgotICAgIEpTUGFyc2VyMTUganNQYXJzZXIgPSBuZXcgSlNQYXJzZXIxNShfaW4pOwotCi0gICAgVG9rZW4gdDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGZvciAodCA9IGpzUGFyc2VyLlByb2dyYW0oKTsgdCAhPSBudWxsOyB0ID0gdC5uZXh0KQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgIC5wcmludGxuKHQua2luZCArICJcdCIgKyBKU1BhcnNlcjE1LnRva2VuSW1hZ2VbdC5raW5kXSArICJcdCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5pbWFnZSArICJcdCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBbm5vdGF0ZWRUb2tlbikgdCkuZ2V0QW5ub3RhdGlvbktpbmQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiXHQiICsgKChBbm5vdGF0ZWRUb2tlbikgdCkuY2FuUmVtb3ZlKCkpOwotICAgICAgICBwcmludFNwZWNpYWxUb2tlbnMoKEFubm90YXRlZFRva2VuKSB0KTsKLSAgICAgIH0KLQotICAgICAgLy8ganNQYXJzZXIuZ2V0Um9vdE5vZGUoKS5kdW1wKCJwIik7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50U3BlY2lhbFRva2VucyhBbm5vdGF0ZWRUb2tlbiB0b2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHNwZWNpYWxUb2tlbiA9IHRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotCi0gICAgd2hpbGUgKHNwZWNpYWxUb2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzcGVjaWFsVG9rZW4uaW1hZ2UpOwotICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBKU1BhcnNlclRlc3QxNSA8SlMgRmlsZT4iKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEZpbGUganNGaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0gICAgRmlsZUlucHV0U3RyZWFtIGluRmlsZVN0cmVhbTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGluRmlsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oanNGaWxlKTsKLQotICAgICAgSlNQYXJzZXJUZXN0MTUganNQYXJzZXJUZXN0ID0gbmV3IEpTUGFyc2VyVGVzdDE1KGluRmlsZVN0cmVhbSk7Ci0gICAgICBqc1BhcnNlclRlc3Quc3RhcnQoKTsKLSAgICAgIGluRmlsZVN0cmVhbS5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTm90Rm91bmQiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlSU8iKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0pTUGFyc2VyVXRpbHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvSlNQYXJzZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZlMzc1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvSlNQYXJzZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIEpTUGFyc2VyVXRpbHMKLXsKLSAgcHVibGljIEpTUGFyc2VyVXRpbHMoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIGZ1bmNUb2tlbgotICAgKiBAcGFyYW0gYm9keVN0YXJ0Ci0gICAqIEBwYXJhbSBib2R5RW5kCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdGFnRXZhbENhbGxzKFRva2VuIGZ1bmNUb2tlbiwgVG9rZW4gYm9keVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuIGJvZHlFbmQpCi0gIHsKLSAgICBib29sZWFuIGhhc0V2YWwgPSBmYWxzZTsKLSAgICBUb2tlbiB0b2tlbiA9IGJvZHlTdGFydDsKLQotICAgIHdoaWxlICh0b2tlbiAhPSBib2R5RW5kKQotICAgIHsKLSAgICAgIGlmICgodG9rZW4ua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLklERU5USUZJRVIpICYmCi0gICAgICAgICAgdG9rZW4uaW1hZ2UuZXF1YWxzKCJldmFsIikgJiYgKHRva2VuLm5leHQgIT0gbnVsbCkgJiYKLSAgICAgICAgICAodG9rZW4ubmV4dC5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuTFBBUkVOKSkKLSAgICAgIHsKLSAgICAgICAgaGFzRXZhbCA9IHRydWU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKLSAgICB9Ci0KLSAgICAoKEFubm90YXRlZFRva2VuKSBmdW5jVG9rZW4pLnNldEZ1bmN0aW9uVXNlc0V2YWwoaGFzRXZhbCk7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIGNvbnRleHRTdGFjawotICAgKiBAcGFyYW0gdG9rZW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXNoVG9rZW4oUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4pCi0gIHsKLSAgICBQcm9ncmFtQ29udGV4dCBjb250ZXh0ID0gKFByb2dyYW1Db250ZXh0KSBjb250ZXh0U3RhY2sucGVlaygpOwotICAgIGNvbnRleHQuYWRkVG9rZW4odG9rZW4uaW1hZ2UsIHRva2VuKTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICAqIEBwYXJhbSB2Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHVzaFRva2VucyhQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywgVmVjdG9yIHYpCi0gIHsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGl0ZW0gPSB2LmVsZW1lbnRzKCk7IGl0ZW0uaGFzTW9yZUVsZW1lbnRzKCk7ICkKLSAgICB7Ci0gICAgICBBbm5vdGF0ZWRUb2tlbiB0ID0gKEFubm90YXRlZFRva2VuKSBpdGVtLm5leHRFbGVtZW50KCk7Ci0gICAgICBwdXNoVG9rZW4oY29udGV4dFN0YWNrLCB0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIG9ialRva2VuCi0gICAqIEBwYXJhbSBlbmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0YWdPYmplY3RJZGVudGlmaWVyKFRva2VuIG9ialRva2VuLCBUb2tlbiBlbmQpCi0gIHsKLSAgICBUb2tlbiB0ID0gb2JqVG9rZW4ubmV4dDsKLSAgICBUb2tlbiBzdWZmaXhUb2tlbiA9IG51bGw7Ci0KLSAgICB3aGlsZSAodCAhPSBlbmQpCi0gICAgewotICAgICAgaWYgKHQua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLkRPVCkKLSAgICAgIHsKLSAgICAgICAgYW5ub3RhdGVUb2tlbihvYmpUb2tlbiwgQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfSURFTlRJRklFUiwKLSAgICAgICAgICAgICAgICAgICAgICBudWxsLCAtMSk7Ci0gICAgICAgIHN1ZmZpeFRva2VuID0gdC5uZXh0OwotCi0gICAgICAgIGlmICgoc3VmZml4VG9rZW4gIT0gbnVsbCkgJiYKLSAgICAgICAgICAgIChzdWZmaXhUb2tlbi5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuSURFTlRJRklFUikpCi0gICAgICAgIHsKLSAgICAgICAgICBhbm5vdGF0ZVRva2VuKHN1ZmZpeFRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfRklFTERfSURFTlRJRklFUiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoKHQua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLkxQQVJFTikgJiYgKHN1ZmZpeFRva2VuICE9IG51bGwpKQotICAgICAgewotICAgICAgICBhbm5vdGF0ZVRva2VuKHN1ZmZpeFRva2VuLAotICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX01FVEhPRF9JREVOVElGSUVSLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgIC0xKTsKLSAgICAgIH0KLQotICAgICAgdCA9IHQubmV4dDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIGNvbnRleHRTdGFjawotICAgKiBAcGFyYW0gc3RhcnQKLSAgICogQHBhcmFtIGVuZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHRhZ01ldGhvZEludm9jYXRpb24oUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBlbmQpCi0gIHsKLSAgICBpZiAodGFnQXNzZXJ0UHJvZmlsZXJDYWxscyhjb250ZXh0U3RhY2ssIHN0YXJ0LCBlbmQpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0YWdMb2dnZXJDYWxscyhjb250ZXh0U3RhY2ssIHN0YXJ0LCBlbmQpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgICogQHBhcmFtIHN0YXJ0Ci0gICAqIEBwYXJhbSBlbmQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0YWdBc3NlcnRQcm9maWxlckNhbGxzKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBlbmQpCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0OwotICAgIGJvb2xlYW4gaXNTcGVjaWFsVHlwZSA9IGZhbHNlOwotICAgIGJvb2xlYW4gaXNSZW1vdmFibGUgPSBmYWxzZTsKLQotICAgIHdoaWxlICh0b2tlbiAhPSBlbmQpCi0gICAgewotICAgICAgLy8gVGhpcyBjaGVja3MgZm9yOgotICAgICAgLy8gIlByb2ZpbGVyLnh4eD0uLi47IgotICAgICAgLy8gb3IgImZvby48cHJvZmlsZXIgbWV0aG9kPjsiIHdoZXJlIGZvbyBpcyBhIHZhciBvZiB0eXBlIFByb2ZpbGVyCi0gICAgICBBbm5vdGF0ZWRUb2tlbiBvYmpUb2tlbiA9IGNvbnRleHRTdGFjay5nZXRUb2tlbih0b2tlbi5pbWFnZSk7Ci0KLSAgICAgIGlmICgodG9rZW4uaXNTcGVjaWFsQ2xhc3NUeXBlKCkgfHwKLSAgICAgICAgICAgKChvYmpUb2tlbiAhPSBudWxsKSAmJiBvYmpUb2tlbi5pc1NwZWNpYWxPYmplY3RUeXBlKCkpKSAmJgotICAgICAgICAgICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfSURFTlRJRklFUikpCi0gICAgICB7Ci0gICAgICAgIGlzU3BlY2lhbFR5cGUgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAoaXNTcGVjaWFsVHlwZSAmJgotICAgICAgICAgICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfTUVUSE9EX0lERU5USUZJRVIpKQotICAgICAgewotICAgICAgICBpc1JlbW92YWJsZSA9IHRydWU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIGlmIChpc1JlbW92YWJsZSkKLSAgICB7Ci0gICAgICB0b2tlbiA9IHN0YXJ0OwotCi0gICAgICB3aGlsZSAodG9rZW4gIT0gZW5kKQotICAgICAgewotICAgICAgICB0b2tlbi5zZXRSZW1vdmFibGUodHJ1ZSk7Ci0gICAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgICAgfQotCi0gICAgICBpZiAodG9rZW4ua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLlNFTUlDT0xPTikKLSAgICAgIHsKLSAgICAgICAgdG9rZW4uc2V0UmVtb3ZhYmxlKHRydWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBpc1JlbW92YWJsZTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICAqIEBwYXJhbSBzdGFydAotICAgKiBAcGFyYW0gZW5kCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGFnTG9nZ2VyQ2FsbHMoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gZW5kKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydDsKLSAgICBib29sZWFuIGlzU3BlY2lhbFR5cGUgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzTE9HR0VSID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc1JlbW92YWJsZSA9IGZhbHNlOwotCi0gICAgd2hpbGUgKHRva2VuICE9IGVuZCkKLSAgICB7Ci0gICAgICAvLyBUaGlzIGNoZWNrcyBmb3I6Ci0gICAgICAvLyAiTG9nZ2VyLkxPR0dFUi48c3RhdGljIG1ldGhvZD4iCi0gICAgICBpZiAoKHRva2VuLmlzU3BlY2lhbENsYXNzVHlwZSgpKSAmJgotICAgICAgICAgICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfSURFTlRJRklFUikpCi0gICAgICB7Ci0gICAgICAgIGlzU3BlY2lhbFR5cGUgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAoaXNTcGVjaWFsVHlwZSAmJgotICAgICAgICAgICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfRklFTERfSURFTlRJRklFUikgJiYKLSAgICAgICAgICB0b2tlbi5pbWFnZS5lcXVhbHMoIkxPR0dFUiIpKQotICAgICAgewotICAgICAgICBpc0xPR0dFUiA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0xPR0dFUiAmJgotICAgICAgICAgICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfTUVUSE9EX0lERU5USUZJRVIpKQotICAgICAgewotICAgICAgICBpc1JlbW92YWJsZSA9IHRydWU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIGlmIChpc1JlbW92YWJsZSkKLSAgICB7Ci0gICAgICB0b2tlbiA9IHN0YXJ0OwotCi0gICAgICB3aGlsZSAodG9rZW4gIT0gZW5kKQotICAgICAgewotICAgICAgICB0b2tlbi5zZXRSZW1vdmFibGUodHJ1ZSk7Ci0gICAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgICAgfQotCi0gICAgICBpZiAodG9rZW4ua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLlNFTUlDT0xPTikKLSAgICAgIHsKLSAgICAgICAgdG9rZW4uc2V0UmVtb3ZhYmxlKHRydWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBpc1JlbW92YWJsZTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICAqIEBwYXJhbSBsaHMKLSAgICogQHBhcmFtIG9wCi0gICAqIEBwYXJhbSByaHMKLSAgICogQHBhcmFtIGVuZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHRhZ0Fzc2lnbm1lbnRFeHByZXNzaW9uKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gdmFyVG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIHJocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIGVuZCkKLSAgewotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gKHZhclRva2VuICE9IG51bGwpPyB2YXJUb2tlbjogbGhzOwotICAgIGJvb2xlYW4gaXNTcGVjaWFsVHlwZSA9IGZhbHNlOwotICAgIGJvb2xlYW4gaXNSZW1vdmFibGUgPSBmYWxzZTsKLSAgICBQcm9ncmFtQ29udGV4dCBjb250ZXh0ID0gKFByb2dyYW1Db250ZXh0KSBjb250ZXh0U3RhY2sucGVlaygpOwotCi0gICAgaWYgKHJocy5raW5kICE9IEpTUGFyc2VyMTVDb25zdGFudHMuSURFTlRJRklFUikKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKHRva2VuICE9IGVuZCkKLSAgICB7Ci0gICAgICAvLyBUaGlzIGNoZWNrcyBmb3I6Ci0gICAgICAvLyAidmFyIGZvbyA9IFByb2ZpbGVyLnh4eD0uLi47IgotICAgICAgLy8gb3IgInZhciBiYXIgPSBmb28uPHByb2ZpbGVyIG1ldGhvZD47IgotICAgICAgQW5ub3RhdGVkVG9rZW4gb2JqVG9rZW4gPSBjb250ZXh0U3RhY2suZ2V0VG9rZW4odG9rZW4uaW1hZ2UpOwotCi0gICAgICBpZiAoKHRva2VuLmlzU3BlY2lhbENsYXNzVHlwZSgpIHx8Ci0gICAgICAgICAgICgob2JqVG9rZW4gIT0gbnVsbCkgJiYgb2JqVG9rZW4uaXNTcGVjaWFsT2JqZWN0VHlwZSgpKSkgJiYKLSAgICAgICAgICAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX0lERU5USUZJRVIpKQotICAgICAgewotICAgICAgICBpc1NwZWNpYWxUeXBlID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzU3BlY2lhbFR5cGUgJiYKLSAgICAgICAgICAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX01FVEhPRF9JREVOVElGSUVSKSkKLSAgICAgIHsKLSAgICAgICAgaXNSZW1vdmFibGUgPSB0cnVlOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNSZW1vdmFibGUpCi0gICAgewotICAgICAgdG9rZW4gPSAodmFyVG9rZW4gIT0gbnVsbCk/IHZhclRva2VuOiBsaHM7Ci0KLSAgICAgIEFubm90YXRlZFRva2VuIHByZXZUb2tlbiA9IGxoczsKLQotICAgICAgd2hpbGUgKHRva2VuICE9IGVuZCkKLSAgICAgIHsKLSAgICAgICAgdG9rZW4uc2V0UmVtb3ZhYmxlKHRydWUpOwotCi0gICAgICAgIGlmICh0b2tlbi5nZXROZXh0KCkuaXNTcGVjaWFsQ2xhc3NUeXBlKCkgJiYKLSAgICAgICAgICAgICh0b2tlbi5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuQVNTSUdOKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFRoaXMgc2F2ZXMgdGhlIExIUyB2YXIgbmFtZSAiZm9vIiB0byBiZSByZW1vdmVkIGxhdGVyLiBJdCBhbHNvIGFzc2lnbnMgdGhlIExIUyB0eXBlCi0gICAgICAgICAgLy8gInZhciBmb28gPSBQcm9maWxlci54eHg9Li4uOyIKLSAgICAgICAgICBwcmV2VG9rZW4uc2V0VHlwZSh0b2tlbi5uZXh0LmltYWdlKTsKLSAgICAgICAgICBjb250ZXh0LmFkZFRva2VuKHByZXZUb2tlbi5pbWFnZSwgcHJldlRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZUb2tlbiA9IHRva2VuOwotICAgICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIHQKLSAgICogQHBhcmFtIGFubm90YXRpb25JZAotICAgKiBAcGFyYW0gYW5ub3RhdGlvbk9iamVjdAotICAgKiBAcGFyYW0gd3NTZW5zaXRpdmUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhbm5vdGF0ZVRva2VuKFRva2VuIHQsIGludCBhbm5vdGF0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhbm5vdGF0aW9uT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3NTZW5zaXRpdmUpCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiBhbm5Ub2tlbiA9IChBbm5vdGF0ZWRUb2tlbikgdDsKLSAgICBhbm5Ub2tlbi5zZXRBbm5vdGF0aW9uS2luZChhbm5vdGF0aW9uSWQpOwotCi0gICAgaWYgKGFubm90YXRpb25PYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbm5Ub2tlbi5zZXRBbm5vdGF0aW9uT2JqZWN0KGFubm90YXRpb25PYmplY3QpOwotICAgIH0KLQotICAgIGlmICh3c1NlbnNpdGl2ZSA+PSAwKQotICAgIHsKLSAgICAgIGFublRva2VuLnNldFdTU2Vuc2l0aXZlKHdzU2Vuc2l0aXZlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIHYKLSAgICogQHBhcmFtIGFubm90YXRpb25JZAotICAgKiBAcGFyYW0gYW5ub3RhdGlvbk9iamVjdAotICAgKiBAcGFyYW0gd3NTZW5zaXRpdmUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhbm5vdGF0ZVRva2VucyhWZWN0b3IgdiwgaW50IGFubm90YXRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhbm5vdGF0aW9uT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdzU2Vuc2l0aXZlKQotICB7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBpdGVtID0gdi5lbGVtZW50cygpOyBpdGVtLmhhc01vcmVFbGVtZW50cygpOyApCi0gICAgewotICAgICAgVG9rZW4gdCA9IChUb2tlbikgaXRlbS5uZXh0RWxlbWVudCgpOwotICAgICAgYW5ub3RhdGVUb2tlbih0LCBhbm5vdGF0aW9uSWQsIGFubm90YXRpb25PYmplY3QsIHdzU2Vuc2l0aXZlKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL05hbWVHZW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvTmFtZUdlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDc5YjBjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvTmFtZUdlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lR2VuCi17Ci0gIHByaXZhdGUgaW50IF9uZXh0SWQgPSAwOwotCi0gIHB1YmxpYyBOYW1lR2VuKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAieCIgKyBfbmV4dElkKys7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Byb2dyYW1Db250ZXh0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Byb2dyYW1Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDBjOGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Qcm9ncmFtQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotLy9+LS0tIEpESyBpbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8vfi0tLSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGNsYXNzIFByb2dyYW1Db250ZXh0Ci17Ci0KLSAgLy8gVGFibGUgb2Ygc3ltYm9sIG5hbWUsIEFubm90YXRlZFRva2VuCi0gIHByb3RlY3RlZCBIYXNoTWFwIF9zeW1ib2xUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByb3RlY3RlZCBTdHJpbmcgX25hbWU7Ci0gIHByb3RlY3RlZCBOYW1lR2VuIF9uYW1lR2VuOwotCi0gIC8vfi0tLSBjb25zdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBQcm9ncmFtQ29udGV4dChTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMobmFtZSwgbmV3IE5hbWVHZW4oKSk7Ci0gIH0KLQotICBwdWJsaWMgUHJvZ3JhbUNvbnRleHQoU3RyaW5nIG5hbWUsIE5hbWVHZW4gbmFtZUdlbikKLSAgewotICAgIF9uYW1lID0gbmFtZTsKLSAgICBfbmFtZUdlbiA9IG5hbWVHZW47Ci0gIH0KLQotICAvL34tLS0gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgdm9pZCBhZGRUb2tlbihTdHJpbmcgbmFtZSwgQW5ub3RhdGVkVG9rZW4gdG9rZW4pCi0gIHsKLSAgICBfc3ltYm9sVGFibGUucHV0KG5hbWUsIHRva2VuKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTeW1ib2xOYW1lKCkKLSAgewotICAgIHJldHVybiBfbmFtZUdlbi5nZXROYW1lKCk7Ci0gIH0KLQotICAvL34tLS0gZ2V0IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lOwotICB9Ci0KLSAgcHVibGljIE5hbWVHZW4gZ2V0TmFtZUdlbigpCi0gIHsKLSAgICByZXR1cm4gX25hbWVHZW47Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZ2V0VG9rZW4oU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiAoQW5ub3RhdGVkVG9rZW4pIF9zeW1ib2xUYWJsZS5nZXQoa2V5KTsKLSAgfQotCi0gIC8vfi0tLSBzZXQgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBfbmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lR2VuKE5hbWVHZW4gbmFtZUdlbikKLSAgewotICAgIF9uYW1lR2VuID0gbmFtZUdlbjsKLSAgfQotfQotCi0KLS8vfiBGb3JtYXR0ZWQgYnkgSmluZGVudCAtLS0gaHR0cDovL3d3dy5qaW5kZW50LmNvbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvUHJvZ3JhbUNvbnRleHRTdGFjay5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Qcm9ncmFtQ29udGV4dFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZmU4MjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Qcm9ncmFtQ29udGV4dFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi0vL34tLS0gSkRLIGltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8vfi0tLSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGNsYXNzIFByb2dyYW1Db250ZXh0U3RhY2sgZXh0ZW5kcyBTdGFjayB7Ci0gICAgcHVibGljIFByb2dyYW1Db250ZXh0U3RhY2soKSB7fQotCi0gICAgLy9+LS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgUHJvZ3JhbUNvbnRleHQgcG9wQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuICgoUHJvZ3JhbUNvbnRleHQpIHBvcCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXNoQ29udGV4dChQcm9ncmFtQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHB1c2goY29udGV4dCk7Ci0gICAgfQotCi0gICAgLy9+LS0tIGdldCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZ2V0VG9rZW4oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBudWxsOwotCi0gICAgICAgIGZvciAoaW50IGkgPSBzaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgUHJvZ3JhbUNvbnRleHQgY29udGV4dCA9IChQcm9ncmFtQ29udGV4dCkgZ2V0KGkpOwotCi0gICAgICAgICAgICBpZiAobnVsbCAhPSAodG9rZW4gPSBjb250ZXh0LmdldFRva2VuKG5hbWUpKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gZGVwdGgKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIEFubm90YXRlZFRva2VuIGdldFRva2VuKFN0cmluZyBuYW1lLCBpbnQgZGVwdGgpIHsKLSAgICAgICAgaW50IGVuZDsKLQotICAgICAgICBlbmQgPSBzaXplKCkgLSBkZXB0aDsKLSAgICAgICAgZW5kID0gTWF0aC5tYXgoZW5kLCAwKTsKLQotICAgICAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHNpemUoKSAtIDE7IGkgPj0gZW5kOyBpLS0pIHsKLSAgICAgICAgICAgIFByb2dyYW1Db250ZXh0IGNvbnRleHQgPSAoUHJvZ3JhbUNvbnRleHQpIGdldChpKTsKLQotICAgICAgICAgICAgaWYgKG51bGwgIT0gKHRva2VuID0gY29udGV4dC5nZXRUb2tlbihuYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci19Ci0KLQotLy9+IEZvcm1hdHRlZCBieSBKaW5kZW50IC0tLSBodHRwOi8vd3d3LmppbmRlbnQuY29tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Ub2tlbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQyOTQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW4uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCi0gKi8KLQotcHVibGljIGNsYXNzIFRva2VuIHsKLQotICAvKioKLSAgICogQW4gaW50ZWdlciB0aGF0IGRlc2NyaWJlcyB0aGUga2luZCBvZiB0aGlzIHRva2VuLiAgVGhpcyBudW1iZXJpbmcKLSAgICogc3lzdGVtIGlzIGRldGVybWluZWQgYnkgSmF2YUNDUGFyc2VyLCBhbmQgYSB0YWJsZSBvZiB0aGVzZSBudW1iZXJzIGlzCi0gICAqIHN0b3JlZCBpbiB0aGUgZmlsZSAuLi5Db25zdGFudHMuamF2YS4KLSAgICovCi0gIHB1YmxpYyBpbnQga2luZDsKLQotICAvKioKLSAgICogYmVnaW5MaW5lIGFuZCBiZWdpbkNvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgKiBvZiB0aGlzIHRva2VuOyBlbmRMaW5lIGFuZCBlbmRDb2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgotICAgKi8KLSAgcHVibGljIGludCBiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW47Ci0KLSAgLyoqCi0gICAqIFRoZSBzdHJpbmcgaW1hZ2Ugb2YgdGhlIHRva2VuLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBpbWFnZTsKLQotICAvKioKLSAgICogQSByZWZlcmVuY2UgdG8gdGhlIG5leHQgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuIGZyb20gdGhlIGlucHV0Ci0gICAqIHN0cmVhbS4gIElmIHRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBpZiB0aGUKLSAgICogdG9rZW4gbWFuYWdlciBoYXMgbm90IHJlYWQgdG9rZW5zIGJleW9uZCB0aGlzIG9uZSwgdGhpcyBmaWVsZCBpcwotICAgKiBzZXQgdG8gbnVsbC4gIFRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoaXMgdG9rZW4gaXMgYWxzbyBhIHJlZ3VsYXIKLSAgICogdG9rZW4uICBPdGhlcndpc2UsIHNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGVudHMgb2YKLSAgICogdGhpcyBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBuZXh0OwotCi0gIC8qKgotICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gYWNjZXNzIHNwZWNpYWwgdG9rZW5zIHRoYXQgb2NjdXIgcHJpb3IgdG8gdGhpcwotICAgKiB0b2tlbiwgYnV0IGFmdGVyIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuLgotICAgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBzcGVjaWFsIHRva2VucywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gbnVsbC4KLSAgICogV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdWNoIHNwZWNpYWwgdG9rZW4sIHRoaXMgZmllbGQgcmVmZXJzCi0gICAqIHRvIHRoZSBsYXN0IG9mIHRoZXNlIHNwZWNpYWwgdG9rZW5zLCB3aGljaCBpbiB0dXJuIHJlZmVycyB0byB0aGUgbmV4dAotICAgKiBwcmV2aW91cyBzcGVjaWFsIHRva2VuIHRocm91Z2ggaXRzIHNwZWNpYWxUb2tlbiBmaWVsZCwgYW5kIHNvIG9uCi0gICAqIHVudGlsIHRoZSBmaXJzdCBzcGVjaWFsIHRva2VuICh3aG9zZSBzcGVjaWFsVG9rZW4gZmllbGQgaXMgbnVsbCkuCi0gICAqIFRoZSBuZXh0IGZpZWxkcyBvZiBzcGVjaWFsIHRva2VucyByZWZlciB0byBvdGhlciBzcGVjaWFsIHRva2VucyB0aGF0Ci0gICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBpdCAod2l0aG91dCBhbiBpbnRlcnZlbmluZyByZWd1bGFyIHRva2VuKS4gIElmIHRoZXJlCi0gICAqIGlzIG5vIHN1Y2ggdG9rZW4sIHRoaXMgZmllbGQgaXMgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBzcGVjaWFsVG9rZW47Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGltYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICAgcmV0dXJuIGltYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91Ci0gICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCi0gICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgotICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0Ci0gICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbWxweSBhZGQgc29tZXRoaW5nIGxpa2UgOgotICAgKgotICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKCk7Ci0gICAqCi0gICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuCi0gICAqIHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFuZCB1c2UgaXQgaW4geW91ciBsZXhpY2FsIGFjdGlvbnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCi0gIHsKLSAgICAgc3dpdGNoKG9mS2luZCkKLSAgICAgewotICAgICAgIGRlZmF1bHQgOiByZXR1cm4gbmV3IEFubm90YXRlZFRva2VuKCk7Ci0gICAgIH0KLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9qczEuNS5qaiBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvanMxLjUuamoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2ZjOTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9qczEuNS5qagorKysgL2Rldi9udWxsCkBAIC0xLDExODMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotb3B0aW9ucyB7Ci0gIFNUQVRJQz1mYWxzZTsKLSAgREVCVUdfVE9LRU5fTUFOQUdFUj1mYWxzZTsKLSAgREVCVUdfUEFSU0VSPWZhbHNlOwotfQotCi1QQVJTRVJfQkVHSU4oSlNQYXJzZXIxNSkKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLXB1YmxpYyBjbGFzcyBKU1BhcnNlcjE1IAotewotICAgIC8vIFRoaXMgaXMgYSBzdGFjayBvZiBzeW1ib2wgdGFibGVzIGZvciB0aGUgSlMgZmlsZQotICAgIHByb3RlY3RlZCBQcm9ncmFtQ29udGV4dFN0YWNrIF9jb250ZXh0U3RhY2sgPSBuZXcgUHJvZ3JhbUNvbnRleHRTdGFjaygpOwotICAgIAotfQotCi1QQVJTRVJfRU5EKEpTUGFyc2VyMTUpCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBMRVhJQ0FMIFJVTEVTIFNlY3Rpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTl9NR1JfREVDTFMgOgotewotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlZ1ZhbGlkID0gdHJ1ZTsKLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdJbnZhbGlkKCkKLSAgICB7Ci0gICAgICAgIGlzUmVnVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UmVnVmFsaWQoKQotICAgIHsKLSAgICAgICAgaXNSZWdWYWxpZCA9IHRydWU7Ci0gICAgfQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gV0hJVEUgU1BBQ0UgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotU1BFQ0lBTF9UT0tFTiA6Ci17Ci0gICAgICAgIDxFT0w6ICAgKFsiXG4iLCJcciJdKSsgPgotICAgIHwgICA8V1M6ICAgIChbIiAiLCJcdCJdKSsgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENPTU1FTlRTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLU1PUkUgOgotewotICAgICAgICAiLy8iIDogSU5fU0lOR0xFX0xJTkVfQ09NTUVOVAotICAgIHwgICAiLyoiIDogSU5fTVVMVElfTElORV9DT01NRU5UCi19Ci0KLTxJTl9TSU5HTEVfTElORV9DT01NRU5UPgotU1BFQ0lBTF9UT0tFTiA6Ci17Ci0gICAgICAgIDwgU0lOR0xFX0xJTkVfQ09NTUVOVDogKH5bIlxuIiwiXHIiXSkqICgiXG4ifCJcciJ8IlxyXG4iKT8gPiAgOiBERUZBVUxUCi19Ci0KLTxJTl9NVUxUSV9MSU5FX0NPTU1FTlQ+Ci1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgICAgICAgPE1VTFRJX0xJTkVfQ09NTUVOVDogIiovIiA+IDogREVGQVVMVAotfQotCi08SU5fU0lOR0xFX0xJTkVfQ09NTUVOVCwgSU5fTVVMVElfTElORV9DT01NRU5UPgotTU9SRSA6Ci17Ci0gICAgICAgIDwgfltdID4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSRVNFUlZFRCBXT1JEUyBBTkQgTElURVJBTFMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgQlJFQUs6ICAgICAgICAiYnJlYWsiID4KLSAgICB8ICAgPCBDT05USU5VRTogICAgICJjb250aW51ZSIgPgotICAgIHwgICA8IERFTEVURTogICAgICAgImRlbGV0ZSIgPgotICAgIHwgICA8IEVMU0U6ICAgICAgICAgImVsc2UiID4KLSAgICB8ICAgPCBGT1I6ICAgICAgICAgICJmb3IiID4KLSAgICB8ICAgPCBGVU5DVElPTjogICAgICJmdW5jdGlvbiIgPgotICAgIHwgICA8IEZVTkNUSU9OXzogICAgIkZ1bmN0aW9uIiA+Ci0gICAgfCAgIDwgSUY6ICAgICAgICAgICAiaWYiID4KLSAgICB8ICAgPCBJTjogICAgICAgICAgICJpbiIgPgotICAgIHwgICA8IE5FVzogICAgICAgICAgIm5ldyIgPgotICAgIHwgICA8IFJFVFVSTjogICAgICAgInJldHVybiIgPgotICAgIHwgICA8IFRISVM6ICAgICAgICAgInRoaXMiID4KLSAgICB8ICAgPCBUWVBFT0Y6ICAgICAgICJ0eXBlb2YiID4KLSAgICB8ICAgPCBJTlNUQU5DRU9GOiAgICJpbnN0YW5jZW9mIiA+Ci0gICAgfCAgIDwgVkFSOiAgICAgICAgICAidmFyIiA+Ci0gICAgfCAgIDwgVk9JRDogICAgICAgICAidm9pZCIgPgotICAgIHwgICA8IFdISUxFOiAgICAgICAgIndoaWxlIiA+Ci0gICAgfCAgIDwgV0lUSDogICAgICAgICAid2l0aCIgPgotICAgIHwgICA8IENBU0U6ICAgICAgICAgImNhc2UiID4KLSAgICB8ICAgPCBDQVRDSDogICAgICAgICJjYXRjaCIgPgotICAgIHwgICA8IENMQVNTOiAgICAgICAgImNsYXNzIiA+Ci0gICAgfCAgIDwgQ09OU1Q6ICAgICAgICAiY29uc3QiID4KLSAgICB8ICAgPCBERUJVR0dFUjogICAgICJkZWJ1Z2dlciIgPgotICAgIHwgICA8IF9ERUZBVUxUOiAgICAgImRlZmF1bHQiID4KLSAgICB8ICAgPCBETzogICAgICAgICAgICJkbyIgPgotICAgIHwgICA8IEVOVU06ICAgICAgICAgImVudW0iID4KLSAgICB8ICAgPCBFWFBPUlQ6ICAgICAgICJleHBvcnQiID4KLSAgICB8ICAgPCBFWFRFTkRTOiAgICAgICJleHRlbmRzIiA+Ci0gICAgfCAgIDwgRklOQUxMWTogICAgICAiZmluYWxseSIgPgotICAgIHwgICA8IElNUE9SVDogICAgICAgImltcG9ydCIgPgotICAgIHwgICA8IFNVUEVSOiAgICAgICAgInN1cGVyIiA+Ci0gICAgfCAgIDwgU1dJVENIOiAgICAgICAic3dpdGNoIiA+Ci0gICAgfCAgIDwgVEhST1c6ICAgICAgICAidGhyb3ciID4KLSAgICB8ICAgPCBUUlk6ICAgICAgICAgICJ0cnkiID4KLSAgICB8ICAgPCBUUlVFOiAgICAgICAgICJ0cnVlIiA+ICAgIC8vIFRoZXkgYXJlIG5vdCBzdXBwb3NlZCB0byBiZSBrZXl3b3JkcwotICAgIHwgICA8IEZBTFNFOiAgICAgICAgImZhbHNlIiA+ICAgLy8gVGhleSBhcmUgbm90IHN1cHBvc2VkIHRvIGJlIGtleXdvcmRzCi0gICAgfCAgIDwgTlVMTDogICAgICAgICAibnVsbCIgPiAgICAvLyBUaGV5IGFyZSBub3Qgc3VwcG9zZWQgdG8gYmUga2V5d29yZHMKLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBMSVRFUkFMUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgREVDSU1BTF9MSVRFUkFMOiBbIjEiLSI5Il0gKFsiMCItIjkiXSkqID4KLSAgICB8ICAgPCBIRVhfTElURVJBTDogIjAiIFsieCIsIlgiXSAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSkrID4KLSAgICB8ICAgPCBPQ1RBTF9MSVRFUkFMOiAiMCIgKFsiMCItIjciXSkqID4KLSAgICB8ICAgPCBGTE9BVElOR19QT0lOVF9MSVRFUkFMOiAoWyIwIi0iOSJdKSsgIi4iIChbIjAiLSI5Il0pKiAoPEVYUE9ORU5UPik/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIi4iIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8gCi0gICAgICAgID4KLSAgICB8ICAgPCAjRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4KLSAgICB8ICAgPCBTVFJJTkdfTElURVJBTDogICAiXCIiICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh+WyJcIiIsIlxcIiwiXG4iLCJcciJdKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiXCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIlwiIiwgIlxcIl0pIHwgIlxcIiAoIlxuIiB8ICJcciIgfCAiXHJcbiIpIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiAgCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIiciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiJyIsIlxcIiwiXG4iLCJcciJdKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciCi0gICAgICAgID4KLSAgICB8ICAgPCAjRVNDQVBFX1NFUVVFTkNFOiAKLSAgICAgICAgICAgICJcXCIKLSAgICAgICAgICAgICggICAgICAgWyJuIiwidCIsImIiLCJyIiwiZiIsIlxcIiwiJyIsIlwiIiwiWyIsIl0iXQotICAgICAgICAgICAgICAgIHwgICBbIjAiLSI3Il0gKCBbIjAiLSI3Il0gKT8KLSAgICAgICAgICAgICAgICB8ICAgWyIwIi0iMyJdIFsiMCItIjciXSBbIjAiLSI3Il0KLSAgICAgICAgICAgICAgICB8ICAgWyJ4Il0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdCi0gICAgICAgICAgICAgICAgfCAgIFsidSJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdCi0gICAgICAgICAgICApCi0gICAgICAgID4KLSAgICB8ICAgPCBVTlRFUk1JTkFURURfU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgICAgICAgICAgIlwiIiAoIDxFU0NBUEVfU0VRVUVOQ0U+IHwgKH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0pICkqICggWyJcbiIsIlxyIl0gKT8KLSAgICAgICAgICAgIHwgICAiJyIgICggPEVTQ0FQRV9TRVFVRU5DRT4gfCAoflsiJyIsIlxcIiwiXG4iLCJcciJdKSAgKSogKCBbIlxuIiwiXHIiXSApPwotICAgICAgICA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkVHVUxBUiBFWFBSRVNTSU9OUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17IAotICAgICAgICA8ICNSRUdYX1NUQVJUX0NIQVIgOiB+WyJcciIsIlxuIiwiLyIsIj0iLCIqIl0gfCAiXFwvIj4KLSAgICB8ICAgPCAjUkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OIDogflsiXHIiLCJcbiIsIi8iXSA+ICAKLSAgICB8ICAgPCAjUkVHWF9CT0RZX0NIQVIgOiAoIDxSRUdYX0JPRFlfQ0hBUl9FWENMVVNJT04+IHwgIlxcLyIgKSA+Ci0gICAgfCAgIDwgI1JFR0VYX0VORF9DSEFSIDogICAgICJpIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZ20iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW1nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdtaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnaW0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWlnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1naSIgCi0gICAgICAgID4KLX0KLQotVE9LRU4gOgotewotICAgICAgICA8UkVHVUxBUl9FWFBSRVNTSU9OIDogIi8iIDxSRUdYX1NUQVJUX0NIQVI+ICg8UkVHWF9CT0RZX0NIQVI+KSogIi8iICg8UkVHRVhfRU5EX0NIQVI+KT8gPgotICAgICAgICB7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gUGVlayBhdCB0aGUgbmV4dCBjaGFyYWN0ZXIuCi0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsKLSAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOwotICAgICAgICAgICAgICAgIGlmIChpc1JlZ1ZhbGlkID09IGZhbHNlIHx8IG5leHRDaCA9PSAnLycgfHwgbmV4dENoID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBMZXhlY2FsIGFuYWx5c2VyIHRoaW5rcyBpdCBpcyBhIFJFCi0gICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yIHN1Y2ggYXMgLy4uLi4uLwotICAgICAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIGV2ZXJ5dGhpbmcgdG8gdGhlIGZpcnN0ICIvIiBiYWNrIG9uIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChsZW5ndGhPZk1hdGNoLTEpOwotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBBbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHRva2VuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUb2tlbi5pbWFnZSA9IG1hdGNoZWRUb2tlbi5pbWFnZS5zdWJzdHJpbmcoMCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlLmRlbGV0ZSgwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBpbWFnZS5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmtpbmQ9U0xBU0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJREVOVElGSUVSUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgSURFTlRJRklFUjogPExFVFRFUj4gKDxMRVRURVI+fDxESUdJVD4pKiA+Ci0gICAgfCAgIDwgI0xFVFRFUjogWyJhIi0ieiIsIkEiLSJaIiwiJCIsIl8iXSA+Ci0gICAgfCAgIDwgI0RJR0lUOiBbIjAiLSI5Il0+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU0VQQVJBVE9SUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgTFBBUkVOOiAgICIoIiA+Ci0gICAgfCAgIDwgUlBBUkVOOiAgICIpIiA+Ci0gICAgfCAgIDwgTEJSQUNFOiAgICJ7IiA+Ci0gICAgfCAgIDwgUkJSQUNFOiAgICJ9IiA+Ci0gICAgfCAgIDwgTEJSQUNLRVQ6ICJbIiA+Ci0gICAgfCAgIDwgUkJSQUNLRVQ6ICJdIiA+Ci0gICAgfCAgIDwgU0VNSUNPTE9OOiAiOyIgPgotICAgIHwgICA8IENPTU1BOiAgICAiLCIgPgotICAgIHwgICA8IERPVDogICAgICAiLiIgPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gT1BFUkFUT1JTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBBU1NJR046ICAgICAgICAgICAgICAgIj0iID4KLSAgICB8ICAgPCBHVDogICAgICAgICAgICAgICAgICAgIj4iID4KLSAgICB8ICAgPCBMVDogICAgICAgICAgICAgICAgICAgIjwiID4KLSAgICB8ICAgPCBCQU5HOiAgICAgICAgICAgICAgICAgIiEiID4KLSAgICB8ICAgPCBUSUxERTogICAgICAgICAgICAgICAgIn4iID4KLSAgICB8ICAgPCBIT09LOiAgICAgICAgICAgICAgICAgIj8iID4KLSAgICB8ICAgPCBDT0xPTjogICAgICAgICAgICAgICAgIjoiID4KLSAgICB8ICAgPCBFUTogICAgICAgICAgICAgICAgICAgIj09IiA+Ci0gICAgfCAgIDwgTEU6ICAgICAgICAgICAgICAgICAgICI8PSIgPgotICAgIHwgICA8IEdFOiAgICAgICAgICAgICAgICAgICAiPj0iID4KLSAgICB8ICAgPCBORTogICAgICAgICAgICAgICAgICAgIiE9IiA+Ci0gICAgfCAgIDwgU0NfT1I6ICAgICAgICAgICAgICAgICJ8fCIgPgotICAgIHwgICA8IFNDX0FORDogICAgICAgICAgICAgICAiJiYiID4KLSAgICB8ICAgPCBJTkNSOiAgICAgICAgICAgICAgICAgIisrIiA+Ci0gICAgfCAgIDwgREVDUjogICAgICAgICAgICAgICAgICItLSIgPgotICAgIHwgICA8IFBMVVM6ICAgICAgICAgICAgICAgICAiKyIgPgotICAgIHwgICA8IE1JTlVTOiAgICAgICAgICAgICAgICAiLSIgPgotICAgIHwgICA8IFNUQVI6ICAgICAgICAgICAgICAgICAiKiIgPgotICAgIHwgICA8IFNMQVNIOiAgICAgICAgICAgICAgICAiLyIgPgotICAgIHwgICA8IEJJVF9BTkQ6ICAgICAgICAgICAgICAiJiIgPgotICAgIHwgICA8IEJJVF9PUjogICAgICAgICAgICAgICAifCIgPgotICAgIHwgICA8IFhPUjogICAgICAgICAgICAgICAgICAiXiIgPgotICAgIHwgICA8IFJFTTogICAgICAgICAgICAgICAgICAiJSIgPgotICAgIHwgICA8IExTSElGVDogICAgICAgICAgICAgICAiPDwiID4KLSAgICB8ICAgPCBSU0lHTkVEU0hJRlQ6ICAgICAgICAgIj4+IiA+Ci0gICAgfCAgIDwgUlVOU0lHTkVEU0hJRlQ6ICAgICAgICI+Pj4iID4KLSAgICB8ICAgPCBQTFVTQVNTSUdOOiAgICAgICAgICAgIis9IiA+Ci0gICAgfCAgIDwgTUlOVVNBU1NJR046ICAgICAgICAgICItPSIgPgotICAgIHwgICA8IFNUQVJBU1NJR046ICAgICAgICAgICAiKj0iID4KLSAgICB8ICAgPCBTTEFTSEFTU0lHTjogICAgICAgICAgIi89IiA+Ci0gICAgfCAgIDwgQU5EQVNTSUdOOiAgICAgICAgICAgICImPSIgPgotICAgIHwgICA8IE9SQVNTSUdOOiAgICAgICAgICAgICAifD0iID4KLSAgICB8ICAgPCBYT1JBU1NJR046ICAgICAgICAgICAgIl49IiA+Ci0gICAgfCAgIDwgUkVNQVNTSUdOOiAgICAgICAgICAgICIlPSIgPgotICAgIHwgICA8IExTSElGVEFTU0lHTjogICAgICAgICAiPDw9IiA+Ci0gICAgfCAgIDwgUlNJR05FRFNISUZUQVNTSUdOOiAgICI+Pj0iID4KLSAgICB8ICAgPCBSVU5TSUdORURTSElGVEFTU0lHTjogIj4+Pj0iID4KLSAgICB8ICAgPCBJREVOVElUWU9QRVI6ICAgICAgICAgIj09PSIgPgotICAgIHwgICA8IE5PVElERU5USVRZT1BFUjogICAgICAiIT09IiA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBHUkFNTUFSIFNlY3Rpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBMaXRlcmFsKCk6Ci17fQotewotICAgICAgICA8REVDSU1BTF9MSVRFUkFMPiAKLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+Ci0gICAgfCAgIDxIRVhfTElURVJBTD4KLSAgICB8ICAgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IAotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+IAotICAgIHwgICA8VFJVRT4gCi0gICAgfCAgIDxGQUxTRT4KLSAgICB8ICAgPFJFR1VMQVJfRVhQUkVTU0lPTj4gCi0gICAgfCAgIDxOVUxMPgotfQotCi1Ub2tlbiBJZGVudGlmaWVyKCk6Ci17Ci0JCVRva2VuIHQ7Ci19Ci17Ci0gICAgCXQgPSA8SURFTlRJRklFUj4ge3JldHVybiB0O30KLX0KLQotdm9pZCBQcmltYXJ5RXhwcmVzc2lvbigpOgotewotCQlUb2tlbiBwcmVmaXhUb2tlbiA9IG51bGw7CQotfQotewotICAgICgKLSAgICAgICAgcHJlZml4VG9rZW4gPSA8VEhJUz4gICAgICAgICAgICAoUHJpbWFyeVN1ZmZpeCgpKSoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnT2JqZWN0SWRlbnRpZmllcihwcmVmaXhUb2tlbiwgZ2V0VG9rZW4oMSkpOwotICAgICAgICAgICAgfQotICAgIHwgICBwcmVmaXhUb2tlbj1JZGVudGlmaWVyKCkgICAgICAgIChQcmltYXJ5U3VmZml4KCkpKgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdPYmplY3RJZGVudGlmaWVyKHByZWZpeFRva2VuLCBnZXRUb2tlbigxKSk7Ci0gICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ01ldGhvZEludm9jYXRpb24oX2NvbnRleHRTdGFjaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXByZWZpeFRva2VuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pZ2V0VG9rZW4oMSkpOwotICAgICAgICAgICAgfQotICAgIHwgICBMT09LQUhFQUQoMikgIDxTVFJJTkdfTElURVJBTD4gICAgICAoUHJpbWFyeVN1ZmZpeCgpKSogIAotICAgIHwgICBMT09LQUhFQUQoMikgIDxSRUdVTEFSX0VYUFJFU1NJT04+ICAoUHJpbWFyeVN1ZmZpeCgpKSogICAgCi0gICAgfCAgIExPT0tBSEVBRCgyKSAgTGl0ZXJhbCgpIAotICAgIHwgICBGdW5jdGlvbkxpdGVyYWwoKQotICAgIHwgICBOZXN0ZWRBcnJheUxpdGVyYWwoKSAgICAgICAgICAgICAgICAoUHJpbWFyeVN1ZmZpeCgpKSoKLSAgICB8ICAgT2JqZWN0TGl0ZXJhbCgpIAotICAgIHwgICA8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4gICAgICAoUHJpbWFyeVN1ZmZpeCgpKSogCi0gICAgfCAgIEFsbG9jYXRpb25FeHByZXNzaW9uKCkgKFByaW1hcnlTdWZmaXgoKSkqICAgICAgICAgICAgIAotICAgICkKLSAgICB7Ci0gICAgICAgIHRva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpOwotICAgIH0KLX0KLQotdm9pZCBQcmltYXJ5U3VmZml4KCk6Ci17fQotewotICAgICAgICBBcmd1bWVudHMoKSAKLSAgICB8ICAge3Rva2VuX3NvdXJjZS5zZXRSZWdJbnZhbGlkKCk7fSA8TEJSQUNLRVQ+IEV4cHJlc3Npb24oKSA8UkJSQUNLRVQ+IAotICAgIHwgICB7dG9rZW5fc291cmNlLnNldFJlZ0ludmFsaWQoKTt9IDxET1Q+IElkZW50aWZpZXIoKQotfQotCi12b2lkIEFyZ3VtZW50cygpOgote30KLXsKLSAgICAgICAgPExQQVJFTj4ge3Rva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpO30gW0FyZ3VtZW50TGlzdCgpXSA8UlBBUkVOPgotfQotCi12b2lkIEFyZ3VtZW50TGlzdCgpOgote30KLXsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKSAoPENPTU1BPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBMaXRlcmFsQXJndW1lbnRMaXN0KCk6Ci17fQotewotICAgICAgICA8U1RSSU5HX0xJVEVSQUw+ICg8Q09NTUE+IDxTVFJJTkdfTElURVJBTD4pKgotfQotCi12b2lkIE5ld1N1ZmZpeCgpOgote30KLXsKLSAgICAgICAgPERPVD4gSWRlbnRpZmllcigpCi19Ci0KLXZvaWQgQWxsb2NhdGlvbkV4cHJlc3Npb24oKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgTE9PS0FIRUFEKDQpICB0PTxORVc+IDxUSElTPiAgICAgICAoTE9PS0FIRUFEKDIpIE5ld1N1ZmZpeCgpKSogW0xPT0tBSEVBRCgyKSBBcmd1bWVudHMoKV0gCi0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICB8ICAgTE9PS0FIRUFEKDQpICB0PTxORVc+IElkZW50aWZpZXIoKSAoTE9PS0FIRUFEKDIpIE5ld1N1ZmZpeCgpKSogW0xPT0tBSEVBRCgyKSBBcmd1bWVudHMoKV0gCi0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICB8ICAgTE9PS0FIRUFEKDQpICB0PTxORVc+IEZ1bmN0aW9uQ29uc3RydWN0b3IoKSAoTE9PS0FIRUFEKDIpIE5ld1N1ZmZpeCgpKSogW0xPT0tBSEVBRCAoMikgQXJndW1lbnRzKCldIAotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci19Ci0KLQotdm9pZCBQb3N0Zml4T3AoKToKLXt9Ci17Ci0gICAgICAgIDxJTkNSPgotICAgIHwgICA8REVDUj4KLX0KLQotdm9pZCBQb3N0Zml4RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgUHJpbWFyeUV4cHJlc3Npb24oKSBbUG9zdGZpeE9wKCldCi19Ci0KLQotdm9pZCBVbmFyeU9wKCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIHQ9PERFTEVURT4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9Ci0gICAgfCAgIHQ9PFZPSUQ+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fQotICAgIHwgICB0PTxUWVBFT0Y+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fQotICAgIHwgICB0PTxJTkNSPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30KLSAgICB8ICAgdD08REVDUj4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9ICAgIAotICAgIHwgICB0PTxQTFVTPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30gICAgCi0gICAgfCAgIHQ9PE1JTlVTPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30gICAgCi0gICAgfCAgIHQ9PFRJTERFPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30gICAgCi0gICAgfCAgIHQ9PEJBTkc+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fSAgICAKLX0KLQotdm9pZCBVbmFyeUV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCkKLSAgICB8ICAgVW5hcnlPcCgpIFVuYXJ5RXhwcmVzc2lvbigpCi19Ci0KLXZvaWQgTXVsT3AoKToKLXt9Ci17Ci0gICAgICAgIDxTVEFSPgotICAgIHwgICA8U0xBU0g+Ci0gICAgfCAgIDxSRU0+IAotfQotCi12b2lkIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgKE11bE9wKCkgVW5hcnlFeHByZXNzaW9uKCkpKgotfSAKLQotdm9pZCBBZGRPcCgpOgote30KLXsKLSAgICAgICAgPFBMVVM+IAotICAgIHwgICA8TUlOVVM+Ci19Ci0KLXZvaWQgQWRkaXRpdmVFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSAoQWRkT3AoKSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSkqCi19IAotCi12b2lkIFNoaWZ0T3AoKToKLXt9Ci17Ci0gICAgICAgIDxMU0hJRlQ+Ci0gICAgfCAgIDxSU0lHTkVEU0hJRlQ+Ci0gICAgfCAgIDxSVU5TSUdORURTSElGVD4KLX0KLQotdm9pZCBTaGlmdEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEFkZGl0aXZlRXhwcmVzc2lvbigpIChTaGlmdE9wKCkgQWRkaXRpdmVFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIFJlbE9wKCk6Ci17fQotewotICAgICAgICA8TFQ+Ci0gICAgfCAgIDxHVD4gCi0gICAgfCAgIDxMRT4gCi0gICAgfCAgIDxHRT4KLX0KLQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIChMT09LQUhFQUQoMykgKCAgUmVsT3AoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdD08SU5TVEFOQ0VPRj4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHQ9PElOPiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9KQotICAgICAgICAgICAgIFNoaWZ0RXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAoICggIFJlbE9wKCkgCi0gICAgICAgICAgICAgICB8IHQ9PElOU1RBTkNFT0Y+ICAKLSAgICAgICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30pCi0gICAgICAgICAgICAgIFNoaWZ0RXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBFcXVhbE9wKCk6Ci17fQotewotICAgICAgICA8RVE+IAotICAgIHwgICA8TkU+IAotICAgIHwgICA8SURFTlRJVFlPUEVSPiAKLSAgICB8ICAgPE5PVElERU5USVRZT1BFUj4KLX0KLQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgKEVxdWFsT3AoKSBSZWxhdGlvbmFsRXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSAoRXF1YWxPcCgpIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotCi12b2lkIEJpdHdpc2VBTkRPcCgpOgote30KLXsKLSAgICAgICAgPEJJVF9BTkQ+Ci19Ci0KLXZvaWQgQml0d2lzZUFOREV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpIChCaXR3aXNlQU5ET3AoKSBFcXVhbGl0eUV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCkgKEJpdHdpc2VBTkRPcCgpIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLQotdm9pZCBCaXR3aXNlWE9ST3AoKToKLXt9Ci17Ci0gICAgICAgIDxYT1I+Ci19Ci0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uKCkgKEJpdHdpc2VYT1JPcCgpIEJpdHdpc2VBTkRFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCkgKEJpdHdpc2VYT1JPcCgpIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotdm9pZCBCaXR3aXNlT1JPcCgpOgote30KLXsKLSAgICAgICAgPEJJVF9PUj4KLX0KLQotdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbigpIChCaXR3aXNlT1JPcCgpIEJpdHdpc2VYT1JFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZU9ST3AoKSBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLXZvaWQgTG9naWNhbEFOREV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb24oKSAoPFNDX0FORD4gQml0d2lzZU9SRXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCkgKDxTQ19BTkQ+IEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uKCkgKDxTQ19PUj4gTG9naWNhbEFOREV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpICg8U0NfT1I+IExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotdm9pZCBDb25kaXRpb25hbEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKSBbPEhPT0s+IEV4cHJlc3Npb24oKSA8Q09MT04+IENvbmRpdGlvbmFsRXhwcmVzc2lvbigpXQotfQotCi12b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgWzxIT09LPiBFeHByZXNzaW9uTm9JTigpIDxDT0xPTj4gQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTigpXQotfQotCi1Ub2tlbiBBc3NpZ25lbWVudE9wZXJhdG9yKCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgICggdD08QVNTSUdOPgotICAgIHwgICAgIHQ9PFNUQVJBU1NJR04+Ci0gICAgfCAgICAgdD08U0xBU0hBU1NJR04+IAotICAgIHwgICAgIHQ9PFJFTUFTU0lHTj4gCi0gICAgfCAgICAgdD08UExVU0FTU0lHTj4KLSAgICB8ICAgICB0PTxNSU5VU0FTU0lHTj4gCi0gICAgfCAgICAgdD08TFNISUZUQVNTSUdOPiAKLSAgICB8ICAgICB0PTxSU0lHTkVEU0hJRlRBU1NJR04+Ci0gICAgfCAgICAgdD08UlVOU0lHTkVEU0hJRlRBU1NJR04+Ci0gICAgfCAgICAgdD08QU5EQVNTSUdOPiAKLSAgICB8ICAgICB0PTxYT1JBU1NJR04+IAotICAgIHwgICAgIHQ9PE9SQVNTSUdOPiApCi0gICAgICAgIHsgcmV0dXJuIHQ7IH0gCi19Ci0KLXZvaWQgQXNzaWdubWVudEV4cHJlc3Npb24oKToKLXsKLSAgICAgICAgVG9rZW4gdExIUyAgICAgID0gZ2V0VG9rZW4oMSk7IAotCQlUb2tlbiB0T3BlcmF0b3IgPSBudWxsOyAKLQkJVG9rZW4gdFJIUyAgICAgID0gbnVsbDsKLQkJVG9rZW4gdEVuZCAgICAgID0gbnVsbDsKLX0KLXsKLSAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICBbIChBc3NpZ25lbWVudE9wZXJhdG9yKCkgCi0gICAgICAgICAgICAgICB7dFJIUz1nZXRUb2tlbigxKTt9Ci0gICAgICAgICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdEVuZCA9IGdldFRva2VuKDEpOwotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdBc3NpZ25tZW50RXhwcmVzc2lvbihfY29udGV4dFN0YWNrLCBudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRMSFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdE9wZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdFJIUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0RW5kKTsgCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCi19Ci0KLXZvaWQgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk6Ci17Ci0gICAgICAgIFRva2VuIHRMSFMgICAgICA9IGdldFRva2VuKDEpOyAKLQkJVG9rZW4gdE9wZXJhdG9yID0gbnVsbDsgCi0JCVRva2VuIHRSSFMgICAgICA9IG51bGw7Ci0JCVRva2VuIHRFbmQgICAgICA9IG51bGw7Ci19Ci17Ci0gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSAKLSAgICAgICAgICAgIFsgKEFzc2lnbmVtZW50T3BlcmF0b3IoKSB7dFJIUz1nZXRUb2tlbigxKTt9Ci0gICAgICAgICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRFbmQgPSBnZXRUb2tlbigxKTsKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnQXNzaWdubWVudEV4cHJlc3Npb24oX2NvbnRleHRTdGFjaywgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0TEhTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRPcGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRSSFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdEVuZCk7IAotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQotfQotCi0KLXZvaWQgRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICAgOgote30KLXsKLSAgQXNzaWdubWVudEV4cHJlc3Npb24oKSAoICIsIiBBc3NpZ25tZW50RXhwcmVzc2lvbigpICkqCi19ICAgCi0KLXZvaWQgRXhwcmVzc2lvbk5vSU4oKSAgICAgICAgICAgICAgICAgICAgIDoKLXt9Ci17Ci0gIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpICggIiwiIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpICkqCi19ICAgCi0KLQotdm9pZCBTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSAgICBCbG9jayhudWxsKQotICAgIHwgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBJZlN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBJdGVyYXRpb25TdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgQ29udGludWVTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgQnJlYWtTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgUmV0dXJuU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIFdpdGhTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgVHJ5U3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIFRocm93U3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIFN3aXRjaFN0YXRlbWVudCgpCi19Ci0gCi12b2lkIEJsb2NrKFByb2dyYW1Db250ZXh0IGNvbnRleHQpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpICAgIDxMQlJBQ0U+IDxSQlJBQ0U+ICAgCi0gICAgfCAgICAgICAgICAgICAgICAgICA8TEJSQUNFPiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0U3RhY2sucHVzaENvbnRleHQobmV3IFByb2dyYW1Db250ZXh0KCJibG9jayIpKTsKLSAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0YXRlbWVudExpc3QoKV0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UkJSQUNFPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0U3RhY2sucG9wQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotfQotIAotdm9pZCBWYXJpYWJsZVN0YXRlbWVudCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICB0PTxWQVI+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh0KSBTYygpCi19Ci0gCi12b2lkIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFRva2VuIHZhclRva2VuKToKLXt9Ci17Ci0gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24odmFyVG9rZW4pICggPENPTU1BPiBWYXJpYWJsZURlY2xhcmF0aW9uKHZhclRva2VuKSApKgotfQotCi12b2lkIFZhcmlhYmxlRGVjbGFyYXRpb24oVG9rZW4gdmFyVG9rZW4pOgotewotICAgICAgICBUb2tlbiBsaHMgICAgICA9IG51bGw7Ci0gICAgICAgIFRva2VuW10gdEFycmF5ID0gbnVsbDsKLX0KLXsKLSAgICAgICAgbGhzPUlkZW50aWZpZXIoKSBbSW5pdGlhbGl6ZXIoKV0KLSAgICAgICAgewotICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKGxocywgQW5ub3RhdGlvbkNvbnN0YW50cy5WQVJfSURFTlRJRklFUiwgbnVsbCwgLTEpOwotICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5wdXNoVG9rZW4oX2NvbnRleHRTdGFjaywgKEFubm90YXRlZFRva2VuKWxocyk7ICAgICAgCi0gICAgICAKLSAgICAgICAgICAgIGlmKHRBcnJheSAhPSBudWxsKSB7Ci0gICAgICAJICAgICAgIFRva2VuIGVuZCA9IGdldFRva2VuKDEpOwotICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdBc3NpZ25tZW50RXhwcmVzc2lvbihfY29udGV4dFN0YWNrLCAoQW5ub3RhdGVkVG9rZW4pdmFyVG9rZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pbGhzLCAoQW5ub3RhdGVkVG9rZW4pdEFycmF5WzBdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRBcnJheVsxXSwgKEFubm90YXRlZFRva2VuKWVuZCk7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci19Ci0KLVRva2VuW10gSW5pdGlhbGl6ZXIoKToKLXsKLSAgICAgICAgVG9rZW5bXSB0QXJyYXkgPSBuZXcgVG9rZW5bMl07Ci19Ci17Ci0gICAgICAgIHRBcnJheVswXT08QVNTSUdOPiB7dEFycmF5WzFdPWdldFRva2VuKDEpO30gCi0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkKLSAgICAgICAge3JldHVybiB0QXJyYXk7fQotfQotIAotdm9pZCBFbXB0eVN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFNFTUlDT0xPTj4KLX0KLQotdm9pZCBFeHByZXNzaW9uU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICBFeHByZXNzaW9uKCkgU2MoKSAKLX0KLQotSkFWQUNPREUKLSAgdm9pZCBTYygpIHsKLQotICAgIFRva2VuIHRvayA9IGdldFRva2VuKDEpOwotICAgIGlmICh0b2sua2luZCA9PSBTRU1JQ09MT04pIHsKLSAgICAgICB0b2sgPSBnZXROZXh0VG9rZW4oKTsKLSAgICB9IGVsc2UgaWYgKHRvay5zcGVjaWFsVG9rZW4gIT0gbnVsbCkgewotICAgICAgIGlmICghRW9sQ29tbWVudFNraXBXcyh0b2suc3BlY2lhbFRva2VuKSAmJiAodG9rLmtpbmQgIT0gRU9GKSkgewotICAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgodG9rLmtpbmQgIT0gRU9GKSAmJiAodG9rLmtpbmQhPVJCUkFDRSkpIHsKLSAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgICB9Ci0gIH0KLSAKLUpBVkFDT0RFCi0gIGJvb2xlYW4gRW9sQ29tbWVudFNraXBXcyhUb2tlbiB0KSB7Ci0gICAgYm9vbGVhbiByZXRWYWwgPSBmYWxzZTsKLSAgICBUb2tlbiBzcGVjaWFsVG9rZW4gPSB0OwotICAgIHdoaWxlKHNwZWNpYWxUb2tlbiAhPSBudWxsKSB7Ci0gICAgICBpZihzcGVjaWFsVG9rZW4ua2luZCA9PSBXUykgewotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gRU9MICB8fCAKLSAgICAgICAgICAgICAgc3BlY2lhbFRva2VuLmtpbmQgPT0gU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotICAgICAgICByZXRWYWwgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotIAotdm9pZCBJZlN0YXRlbWVudCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICA8SUY+IDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPiAKLSAgICAgICAgICAgIFN0YXRlbWVudCgpIAotICAgICAgICAgICAgWyBMT09LQUhFQUQoMSkgdD08RUxTRT4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgICAgICAgICAgIFN0YXRlbWVudCgpCi0gICAgICAgICAgICBdCi19Ci0KLQotdm9pZCBJdGVyYXRpb25TdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpbGVTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgICAgIERvU3RhdGVtZW50KCkKLSAgICB8ICAgTE9PS0FIRUFEKDxGT1I+IDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8U0VNSUNPTE9OPikgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JTdGF0ZW1lbnQoKQotICAgIHwgICBMT09LQUhFQUQoPEZPUj4gPExQQVJFTj4gPFNFTUlDT0xPTj4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvclN0YXRlbWVudCgpCi0gICAgfCAgIExPT0tBSEVBRCg8Rk9SPiA8TFBBUkVOPiB2YXJUb2Vrbj08VkFSPiBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh2YXJUb2tlbikgPFNFTUlDT0xPTj4pICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JWYXJTdGF0ZW1lbnQoKQotICAgIHwgICBMT09LQUhFQUQoMykgICAgICAgIEZvckluU3RhdGVtZW50KCkKLSAgICB8ICAgTE9PS0FIRUFEKDMpICAgICAgICBGb3JWYXJJblN0YXRlbWVudCgpCi19Ci0gCi12b2lkIERvU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8RE8+IFN0YXRlbWVudCgpIDxXSElMRT4gPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+Ci19Ci0KLXZvaWQgV2hpbGVTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxXSElMRT4gPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+IAotICAgICAgICAgICAgU3RhdGVtZW50KCkKLX0KLSAKLXZvaWQgRm9yU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8Rk9SPiA8TFBBUkVOPiAgW0V4cHJlc3Npb24oKV0gPFNFTUlDT0xPTj4gCi0gICAgICAgICAgICAgICAgICAgICAgICBbRXhwcmVzc2lvbigpXSA8U0VNSUNPTE9OPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFtFeHByZXNzaW9uKCldIDxSUEFSRU4+IAotICAgICAgICAgICAgU3RhdGVtZW50KCkKLX0KLQotdm9pZCBGb3JWYXJTdGF0ZW1lbnQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgPEZPUj4gPExQQVJFTj4gIHQ9PFZBUj4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh0KSA8U0VNSUNPTE9OPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFtFeHByZXNzaW9uKCldICA8U0VNSUNPTE9OPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFtFeHByZXNzaW9uKCldICA8UlBBUkVOPiAKLSAgICAgICAgICAgIFN0YXRlbWVudCgpCi19Ci0KLXZvaWQgRm9ySW5TdGF0ZW1lbnQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgPEZPUj4gPExQQVJFTj4gIEV4cHJlc3Npb25Ob0lOKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0PTxJTj4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fQotICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbk5vSU4oKSA8UlBBUkVOPiAKLSAgICAgICAgICAgIFN0YXRlbWVudCgpCi19Ci0gCi12b2lkIEZvclZhckluU3RhdGVtZW50KCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIDxGT1I+IDxMUEFSRU4+ICAKLSAgICAgICAgICAgICAgICB0PTxWQVI+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgICAgICAgICAgICAgIHQ9SWRlbnRpZmllcigpIAotICAgICAgICAgICAgICAgICAgewotICAgCSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlZBUl9JREVOVElGSUVSLCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpOwotICAgCSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMucHVzaFRva2VuKF9jb250ZXh0U3RhY2ssIChBbm5vdGF0ZWRUb2tlbil0KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBbSW5pdGlhbGl6ZXIoKV0gCi0gICAgICAgICAgICAgICAgdD08SU4+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9Ci0gICAgICAgICAgICAgICAgRXhwcmVzc2lvbk5vSU4oKSAKLSAgICAgICAgICAgICAgPFJQQVJFTj4gCi0gICAgICAgICAgICBTdGF0ZW1lbnQoKQotfQotCi12b2lkIENvbnRpbnVlU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8Q09OVElOVUU+IFNjKCkKLX0KLQotdm9pZCBCcmVha1N0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPEJSRUFLPiBTYygpCi19Ci0gCi12b2lkIFJldHVyblN0YXRlbWVudCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICB0PTxSRVRVUk4+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgICAgICBbRXhwcmVzc2lvbigpXSBTYygpCi19Ci0KLXZvaWQgV2l0aFN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFdJVEg+IDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPgotICAgICAgICAgICAgU3RhdGVtZW50KCkKLX0KLQotdm9pZCBUcnlTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxUUlk+IEJsb2NrKG51bGwpCi0gICAgICAgICg8Q0FUQ0g+IDxMUEFSRU4+IElkZW50aWZpZXIoKSA8UlBBUkVOPiBCbG9jayhudWxsKSkqCi0gICAgICAgIFs8RklOQUxMWT4gQmxvY2sobnVsbCldCi19IAotCi12b2lkIFRocm93U3RhdGVtZW50KCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIHQ9PFRIUk9XPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICAgICAgW0V4cHJlc3Npb24oKV0gU2MoKQotfQotCi12b2lkIENhc2VHdWFyZCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICB0PTxDQVNFPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICAgICAgRXhwcmVzc2lvbigpIDxDT0xPTj4KLSAgICB8ICAgPF9ERUZBVUxUPiA8Q09MT04+Ci19Ci0KLXZvaWQgQ2FzZUdyb3VwKCk6Ci17fQotewotICAgICAgICBDYXNlR3VhcmQoKSAoU3RhdGVtZW50KCkpKiAgCi19Ci0KLXZvaWQgU3dpdGNoU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8U1dJVENIPiAgICA8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4gCi0gICAgICAgICAgICAgICAgICAgIDxMQlJBQ0U+IChDYXNlR3JvdXAoKSkqIDxSQlJBQ0U+Ci19Ci0KLXZvaWQgTmFtZWRGdW5jdGlvbigpOgotewotICAgICAgICBUb2tlbiAgdElkZW50aWZpZXIgPSBudWxsOwotICAgICAgICBUb2tlbiAgdEZ1bmN0aW9uICAgPSBudWxsOwotICAgICAgICBUb2tlbiAgYmxvY2tTdGFydCAgPSBudWxsOwotICAgICAgICBUb2tlbiAgYmxvY2tFbmQgICAgPSBudWxsOwotICAgICAgICBWZWN0b3IgcGFyYW1zICAgICAgPSBuZXcgVmVjdG9yKCk7Ci19Ci17Ci0gICAgICAgIHRGdW5jdGlvbj08RlVOQ1RJT04+IAotICAgICAgICB0SWRlbnRpZmllcj1JZGVudGlmaWVyKCkgCi0gICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0SWRlbnRpZmllciwgQW5ub3RhdGlvbkNvbnN0YW50cy5GVU5DVElPTl9OQU1FX0lERU5USUZJRVIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLTEpOyAKLSAgICAgICAgICAgICAgUHJvZ3JhbUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmFtQ29udGV4dCh0SWRlbnRpZmllci5pbWFnZSk7Ci0gICAgICAgICAgICAgIF9jb250ZXh0U3RhY2sucHVzaENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgPExQQVJFTj4gCi0gICAgICAgICAgIFtwYXJhbXM9Rm9ybWFsUGFyYW1ldGVyTGlzdCgpXSAKLSAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbnMocGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQ29uc3RhbnRzLkZVTkNUSU9OX1BBUkFNX0lERU5USUZJRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC0xKTsgCi0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odEZ1bmN0aW9uLCBBbm5vdGF0aW9uQ29uc3RhbnRzLk5BTUVEX0ZVTkNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTsgCi0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnB1c2hUb2tlbnMoX2NvbnRleHRTdGFjaywgcGFyYW1zKTsKLSAgICAgICAgICAgICAgfSAKLQotICAgICAgICA8UlBBUkVOPgotICAgICAgICB7YmxvY2tTdGFydCA9IGdldFRva2VuKDEpO30gCi0gICAgICAgIEJsb2NrKGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgYmxvY2tFbmQgPSBnZXRUb2tlbigxKTsKLSAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdFdmFsQ2FsbHModEZ1bmN0aW9uLCBibG9ja1N0YXJ0LCBibG9ja0VuZCk7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBBbm9ueW1vdXNGdW5jdGlvbigpOgotewotICAgICAgICBUb2tlbiAgdEZ1bmN0aW9uICA9IG51bGw7Ci0gICAgICAgIFRva2VuICBibG9ja1N0YXJ0ID0gbnVsbDsKLSAgICAgICAgVG9rZW4gIGJsb2NrRW5kICAgPSBudWxsOwotICAgICAgICBWZWN0b3IgcGFyYW1zICAgICA9IG5ldyBWZWN0b3IoKTsKLX0KLXsKLSAgICAgICAgdEZ1bmN0aW9uPTxGVU5DVElPTj4KLSAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgUHJvZ3JhbUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmFtQ29udGV4dCgiYW5vbnltb3VzIik7Ci0gICAgICAgICAgICAgIF9jb250ZXh0U3RhY2sucHVzaENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgICAgIH0gCi0gICAgICAgIDxMUEFSRU4+IAotICAgICAgICAgICBbcGFyYW1zPUZvcm1hbFBhcmFtZXRlckxpc3QoKV0gCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW5zKHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbnN0YW50cy5GVU5DVElPTl9QQVJBTV9JREVOVElGSUVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAtMSk7IAotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHRGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQ29uc3RhbnRzLkFOT05ZTU9VU19GVU5DVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIC0xKTsgCi0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnB1c2hUb2tlbnMoX2NvbnRleHRTdGFjaywgcGFyYW1zKTsKLSAgICAgICAgICAgICAgfSAKLSAgICAgICAgPFJQQVJFTj4gCi0gICAgICAgIHtibG9ja1N0YXJ0ID0gZ2V0VG9rZW4oMSk7fQotICAgICAgICBCbG9jayhjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgIGJsb2NrRW5kID0gZ2V0VG9rZW4oMSk7Ci0gICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnRXZhbENhbGxzKHRGdW5jdGlvbiwgYmxvY2tTdGFydCwgYmxvY2tFbmQpOwotICAgICAgICB9Ci19Ci0KLXZvaWQgRnVuY3Rpb25Db25zdHJ1Y3RvcigpOgote30KLXsgICAgCi0gICAgICAgIDxGVU5DVElPTl8+IDxMUEFSRU4+IEFyZ3VtZW50TGlzdCgpIDxSUEFSRU4+IAotfQotCi12b2lkIEZ1bmN0aW9uRGVjbGFyYXRpb24oKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgyKSBOYW1lZEZ1bmN0aW9uKCkgCi0gICAgfCAgIExPT0tBSEVBRCgyKSBBbm9ueW1vdXNGdW5jdGlvbigpCi19ICAgICAgICAgICAKLQotdm9pZCBGdW5jdGlvbkxpdGVyYWwoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgyKSBOYW1lZEZ1bmN0aW9uKCkKLSAgICB8ICAgTE9PS0FIRUFEKDIpIEFub255bW91c0Z1bmN0aW9uKCkKLX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1WZWN0b3IgRm9ybWFsUGFyYW1ldGVyTGlzdCgpOgotewotICAgICAgICBUb2tlbiAgdCA9IG51bGw7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotfQotewotICAgICAgICB0PUlkZW50aWZpZXIoKSB7di5hZGQodCk7fSAKLSAgICAgICAgKDxDT01NQT4gdD1JZGVudGlmaWVyKCkge3YuYWRkKHQpO30pKgotICAgICAgICB7cmV0dXJuIHY7fQotfQotCi12b2lkIExpdGVyYWxFbGVtZW50KCkgOgote30KLXsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKQotfQotCi12b2lkIEVsZW1lbnRMaXN0KCk6Ci17fQotewotICAgICAgICBMaXRlcmFsRWxlbWVudCgpICg8Q09NTUE+IExpdGVyYWxFbGVtZW50KCkpKgotfQotCi12b2lkIEFycmF5TGl0ZXJhbCgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIDxMQlJBQ0tFVD4gPFJCUkFDS0VUPgotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiBFbGVtZW50TGlzdCgpIDxSQlJBQ0tFVD4KLX0KLQotdm9pZCBOZXN0ZWRBcnJheUxpdGVyYWwoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSBBcnJheUxpdGVyYWwoKSAKLSAgICB8ICAgTE9PS0FIRUFEKDMpIDxMQlJBQ0tFVD4gTmVzdGVkQXJyYXlMaXRlcmFsKCkgPFJCUkFDS0VUPgotfQotCi12b2lkIExpdGVyYWxGaWVsZCgpOgotewotICAgICAgICBUb2tlbiB0ID0gbnVsbDsKLX0KLXsKLSAgICAgICAgdD1JZGVudGlmaWVyKCkgICAgIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKQotICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuTElURVJBTF9PQkpFQ1RfS0VZX0lERU5USUZJRVIsbnVsbCwtMSk7IH0KLSAgIHwgICAgdD08U1RSSU5HX0xJVEVSQUw+IDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKQotICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuTElURVJBTF9PQkpFQ1RfS0VZX0lERU5USUZJRVIsbnVsbCwtMSk7IH0KLX0KLQotdm9pZCBGaWVsZExpc3QoKToKLXt9Ci17Ci0gICAgICAgIExpdGVyYWxGaWVsZCgpICg8Q09NTUE+IExpdGVyYWxGaWVsZCgpKSoKLX0KLQotdm9pZCBPYmplY3RMaXRlcmFsKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgPExCUkFDRT4gPFJCUkFDRT4KLSAgICB8ICAgTE9PS0FIRUFEKDIpIDxMQlJBQ0U+IEZpZWxkTGlzdCgpIDxSQlJBQ0U+ICAKLX0KLQotCi1Ub2tlbiBQcm9ncmFtKCk6Ci17Ci0gICAgICAgIFRva2VuIHJldHZhbCA9IGdldFRva2VuKDEpOwotfQotewotICAgICAgICB7X2NvbnRleHRTdGFjay5wdXNoQ29udGV4dChuZXcgUHJvZ3JhbUNvbnRleHQoInJvb3QiKSk7fQotICAgICAgICAoU291cmNlRWxlbWVudCgpKSogIDxFT0Y+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBTb3VyY2VFbGVtZW50KCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgICAgU3RhdGVtZW50KCkgCi0gICAgfCAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uKCkKLX0KLQotdm9pZCBTdGF0ZW1lbnRMaXN0KCk6IAotewotLy8gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIChTdGF0ZW1lbnQoKSkrCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0RldG9rZW5pemVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0RldG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjEyZDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9EZXRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKioKLSAqIENvbnZlcnRzIFRva2VuIE9iamVjdHMgaW50byBhIEphdmFTY3JpcHQgZmlsZQotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIERldG9rZW5pemVyCi17Ci0gIHByaXZhdGUgZmluYWwgUHJpbnRXcml0ZXIgX291dDsKLQotICAvKioKLSAgICogQHBhcmFtIG91dCB0aGUgZmlsZSB0byB3cml0ZSB0aGUgb3V0cHV0IHRvLgotICAgKi8KLSAgcHVibGljIERldG9rZW5pemVyKFByaW50V3JpdGVyIG91dCkKLSAgewotICAgIHRoaXMuX291dCA9IG91dDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFByaW50V3JpdGVyIGFuZCBjYWxscyB0aGUgb3RoZXIgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgRGV0b2tlbml6ZXIoV3JpdGVyIG91dCkKLSAgewotICAgIHRoaXMobmV3IFByaW50V3JpdGVyKG91dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIGRlY29kZXMgYSB0b2tlbiBhbmQgd3JpdGVzIHRoZSByZXN1bHQKLSAgICogQHBhcmFtIHRvayB0aGUgdG9rZW4gdG8gZGVjb2RlLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoVG9rZW4gdG9rKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGludCBjb20gPSB0b2suY29kZTsKLSAgICBzd2l0Y2goY29tKQotICAgICAgewotICAgICAgY2FzZSBUb2tlbi5ORVdMSU5FIDoKLSAgICAgICAgX291dC5wcmludGxuKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5XSElURVNQQUNFIDoKLSAgICAgICAgX291dC5wcmludCgnICcpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uUEVSSU9EIDoKLSAgICAgICAgX291dC5wcmludCgnLicpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uU0VNSUNPTE9OIDoKLSAgICAgICAgX291dC5wcmludCgnOycpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uUVVPVEVEIDoKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgY2ggPSB0b2suY2g7Ci0gICAgICAgICAgX291dC5wcmludChjaCt0b2suc3RyaW5nK2NoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uQ09OVFJPTCA6Ci0gICAgICBjYXNlIFRva2VuLkxFRlRfQlJBQ0UgOgotICAgICAgY2FzZSBUb2tlbi5SSUdIVF9CUkFDRSA6Ci0gICAgICAgIF9vdXQucHJpbnQodG9rLmNoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLk5VTUJFUiA6Ci0gICAgICBjYXNlIFRva2VuLlJFU0VSVkVEIDoKLSAgICAgIGNhc2UgVG9rZW4uTkFNRSA6Ci0gICAgICAgIF9vdXQucHJpbnQodG9rLnN0cmluZyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5DT01NRU5UIDoKLSAgICAgICAgX291dC5wcmludCgiLyoiK3Rvay5zdHJpbmcrIiovIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5SRUdVTEFSX0VYUCA6Ci0gICAgICAgIF9vdXQucHJpbnQoIi8iK3Rvay5zdHJpbmcrIi8iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLlJFR1VMQVJfRVhQX01PRElGSUVSIDoKLSAgICAgICAgX291dC5wcmludCh0b2suY2gpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uRU9GIDoKLSAgICAgICAgX291dC5jbG9zZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBUb2tlbjoiK3Rvayk7Ci0gICAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbGVQcm9jZXNzb3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTBhNjI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsZVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci0KLS8qKgotICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gc29tZSBwcm9jZXNzaW5nIG9uIGlucHV0IGZpbGVzLAotICogYW5kIHdyaXRlIHRoZSByZXN1bHRzIHRvIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZpbGVzLiBJdCBzdXBwb3J0cyByZWN1cnNpbmcKLSAqIGludG8gc3ViZGlyZWN0b3JpZXMuCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZVByb2Nlc3NvcgotewotICAvKioKLSAgICogQHBhcmFtIGZpbGVuYW1lRXh0IHRoZSBmaWxlbmFtZSBleHRlbnNpb24gdG8gYWNjZXB0LiBJZiBudWxsLCBhbGwgZmlsZXMKLSAgICogIGFyZSBhY2NlcHRlZC4KLSAgICogQHJldHVybiBhIGZpbHRlciB0aGF0IG9ubHkgYWNjZXB0cyBmaWxlcyB3aXRoIG5hbWVzIHRoYXQgZW5kIHdpdGggdGhlCi0gICAqICBzcGVjaWZpZWQgZXh0ZW5zaW9uLiBIb3dldmVyLCB0aGUgZmlsdGVyIGFjY2VwdHMgYWxsIHN1YmRpcmVjdG9yaWVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWxlbmFtZUZpbHRlciBnZXRFeHRlbnNpb25GaWx0ZXIoZmluYWwgU3RyaW5nIGZpbGVuYW1lRXh0KQotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoZmlsZW5hbWVFeHQ9PW51bGwpIHx8IChuYW1lLmVuZHNXaXRoKGZpbGVuYW1lRXh0KSkpIHJldHVybiB0cnVlOwotICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgbmFtZSk7Ci0gICAgICAgICAgcmV0dXJuIGYuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gZmlsdGVyIHVzZWQgdG8gc2VsZWN0IGZpbGVzIGFuZC9vciBzdWJkaXJlY3Rvcmllcy4KLSAgICogQHBhcmFtIGZhaWxGYXN0IGlmIHRydWUsIHRlcm1pbmF0ZXMgYXQgdGhlIGZpcnN0IGVycm9yIChvdGhlcndpc2UsCi0gICAqICBjb250aW51ZXMgd2l0aCB0aGUgbmV4dCBmaWxlKS4KLSAgICogQHBhcmFtIG92ZXJ3cml0ZSBpZiBmYWxzZSwgd2lsbCBub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIG91dHB1dCBmaWxlcyAoVGhhdAotICAgKiAgcGFydGljdWxhciBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgd2lsbCBiZSBza2lwcGVkKS4KLSAgICogQHBhcmFtIHZlcmJvc2UgaWYgdHJ1ZSwgZ2VuZXJhdGVzIHZlcmJvc2Ugb3V0cHV0LiAgKi8KLSAgcHVibGljIEZpbGVQcm9jZXNzb3IoRmlsZW5hbWVGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZhaWxGYXN0LCBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiB2ZXJib3NlKQotICB7Ci0gICAgX2ZpbHRlciA9IGZpbHRlcjsKLSAgICBfZmFpbEZhc3QgPSBmYWlsRmFzdDsKLSAgICBfZG9udE92ZXJ3cml0ZSA9ICFvdmVyd3JpdGU7Ci0gICAgaXNWZXJib3NlID0gdmVyYm9zZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgRmlsZXByb2Nlc3NvciB0aGF0IG92ZXJ3cml0ZXMgYWxsIG91dHB1dCBmaWxlcywgYW5kIGRvZXMgbm90Ci0gICAqIGZhaWwgZmFzdC4KLSAgICogQHBhcmFtIGZpbHRlciB1c2VkIHRvIHNlbGVjdCBmaWxlcyBhbmQvb3Igc3ViZGlyZWN0b3JpZXMuICAqLwotICBwdWJsaWMgRmlsZVByb2Nlc3NvcihGaWxlbmFtZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gdmVyYm9zaXR5KQotICB7Ci0gICAgdGhpcyhmaWx0ZXIsIGZhbHNlLCB0cnVlLCB2ZXJib3NpdHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBGaWxlcHJvY2Vzc29yIHRoYXQgb3ZlcndyaXRlcyBhbGwgb3V0cHV0IGZpbGVzLCBhbmQgZG9lcyBub3QKLSAgICogZmFpbCBmYXN0LgotICAgKiBAcGFyYW0gZXh0ZW5zaW9uIHRoZSBmaWxlIGV4dGVuc2lvbiB0byBmaWx0ZXIgZm9yLiBpZiB0aGlzIGlzIG51bGwsIGFsbAotICAgKiBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gYSBkaXJlY3Rvcnkgd2lsbCBiZSBwcm9jZXNzZWQgcmVjdXJzaXZlbHkuCi0gICAqIEBzZWUgI2dldEV4dGVuc2lvbkZpbHRlcihTdHJpbmcgZXh0ZW5zaW9uKQotICAgKi8KLSAgcHVibGljIEZpbGVQcm9jZXNzb3IoU3RyaW5nIGV4dGVuc2lvbiwgYm9vbGVhbiB2ZXJib3NpdHkpCi0gIHsKLSAgICB0aGlzKGdldEV4dGVuc2lvbkZpbHRlcihleHRlbnNpb24pLCB2ZXJib3NpdHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgZmlsZSBvciBkaXJlY3RvcnkKLSAgICogQHBhcmFtIG91dCBpZiB0aGUgaW5wdXQgaXMgYSBkaXJlY3RvcnksIHRoZW4gdGhpcyBtdXN0IGJlIHRoZSBvdXRwdXQKLSAgICogIGRpcmVjdG9yeS4gT3RoZXJ3aXNlLCB0aGlzIGlzIHRoZSBvdXRwdXQgZmlsZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIHdlcmUgbm8gZXJyb3JzLiBmYWxzZSBvdGhlcndpc2UuICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKEZpbGUgaW4sIEZpbGUgb3V0KQotICB7Ci0gICAgaWYgKGlzVmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIGZpbGU6IitpbisiIHRvIGZpbGU6IitvdXQpOwotCi0gICAgaWYgKGluLmlzRGlyZWN0b3J5KCkpCi0gICAgewotICAgICAgYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgIFN0cmluZ1tdIG5hbWVzID0gaW4ubGlzdChfZmlsdGVyKTsKLSAgICAgIGZvcihpbnQgaT0wLCBzej1uYW1lcy5sZW5ndGg7IGk8c3o7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRmlsZSBzdWJJbiA9IG5ldyBGaWxlKGluLCBuYW1lc1tpXSk7Ci0gICAgICAgIEZpbGUgc3ViT3V0ID0gbmV3IEZpbGUob3V0LCBuYW1lc1tpXSk7Ci0gICAgICAgIHN1Y2Nlc3MgJj0gcHJvY2VzcyhzdWJJbiwgc3ViT3V0KTsKLSAgICAgICAgaWYgKF9mYWlsRmFzdCAmJiAoIXN1Y2Nlc3MpKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAoX2RvbnRPdmVyd3JpdGUgJiYgb3V0LmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzVmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyBmaWxlOiIraW4rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFzIGRlc3RpbmF0aW9uIGZpbGU6IitvdXQrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFscmVhZHkgZXhpc3RzLiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG91dC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgcHJvY2Vzc0ZpbGUoaW4sIG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgcHJvY2Vzc2luZyBmaWxlOiIraW4rIiB0byBmaWxlOiIrb3V0KTsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgdG8gcHJvY2VzcyBhIHNpbmdsZSBmaWxlLgotICAgKiBAcGFyYW0gaW4gdGhlIGlucHV0IGZpbGUuIFRoaXMgaXMgbmV2ZXIgYSBkaXJlY3RvcnkuCi0gICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBmaWxlLiBJZiB0aGlzIGZpbGUgZXhpc3RzIGFuZCBvdmVyd3JpdGluZyBpcyBub3QKLSAgICogcGVybWl0dGVkLCB0aGVuIHRoaXMgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZC4KLSAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhpcyBjbGFzcyBpcyBzZXQgdG8gPGk+ZmFpbCBmYXN0PC9pPiB0aGVuIGFueQotICAgKiBleGNlcHRpb24gdGhyb3duIHdpbGwgY2F1c2UgYWxsIGV4ZWN1dGlvbiB0byBoYWx0LiBJZiB0aGlzIGNsYXNzIGRvZXMgbm90Ci0gICAqIGZhaWwgZmFzdCwgdGhlbiB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcmVwb3J0ZWQgYW5kIGV4ZWN1dGlvbiB3aWxsCi0gICAqIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgZmlsZS4gICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgaW4sIEZpbGUgb3V0KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIHRydWUsIHZlcmJvc2Ugb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNWZXJib3NlOwotCi0gIHByaXZhdGUgICBmaW5hbCBib29sZWFuIF9mYWlsRmFzdCwgX2RvbnRPdmVyd3JpdGU7Ci0gIHByaXZhdGUgICBmaW5hbCBGaWxlbmFtZUZpbHRlciBfZmlsdGVyOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsdGVyMS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWx0ZXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjQ5ODIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWx0ZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogUmVtb3ZlcyBhbGwgY29tbWVudHMgYW5kIHJlZHVuZGFudCB3aGl0ZXNwYWNlCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyMSBpbXBsZW1lbnRzIFRva2VuUmVhZGVyCi17Ci0KLSAgLyoqCi0gICAqIGJsb2NrcyB1bnRpbCBpcyBoYXMgcmVhZCBhdGxlYXN0IG9uZSB0b2tlbiBmcm9tIHRoZSBpbnB1dCByZWFkZXIKLSAgICovCi0gIHB1YmxpYyBGaWx0ZXIxKFRva2VuUmVhZGVyIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBfaW4gPSBpbjsKLSAgICBfbmV4dCA9IF9pbi5yZWFkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBUb2tlblJlYWRlcgotICAgKi8KLSAgcHVibGljIFRva2VuIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBUb2tlbiBjdXIgPSBfbmV4dDsKLSAgICBUb2tlbiByZXMgPSBjdXI7Ci0gICAgZm9yKDtjdXIhPW51bGw7KQotICAgICAgewotICAgICAgICBfbmV4dCA9IF9pbi5yZWFkKCk7Ci0gICAgICAgIHJlcyA9IF9maWx0ZXIoX3ByZXYsIGN1ciwgX25leHQpIDsKLSAgICAgICAgaWYgKHJlcyE9bnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBfcHJldiA9IHJlczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBjdXIgPSBfbmV4dDsKLSAgICAgIH0KLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgZXh0cmEgc3BhY2VzL25ld2xpbmVzIGFuZCBhbGwgY29tbWVudHMKLSAgICovCi0gIHByaXZhdGUgVG9rZW4gX2ZpbHRlcihUb2tlbiBwcmV2LCBUb2tlbiBjdXIsIFRva2VuIG5leHQpCi0gIHsKLSAgICAvL3lzdGVtLm91dC5wcmludGxuKCJmaWx0ZXJpbmcgdG9rZW46IitjdXIpOwotICAgIGludCBjY29kZSA9IGN1ci5jb2RlOwotICAgIGlmICgoY2NvZGU9PVRva2VuLkNPTU1FTlQpIHx8ICAgLy9za2lwIGNvbW1lbnRzCi0gICAgICAgICgoY2NvZGU9PVRva2VuLldISVRFU1BBQ0UpICYmCi0gICAgICAgICAhKF9pc1NwYWNlU2Vuc2l0aXZlKHByZXYpICYmIF9pc1NwYWNlU2Vuc2l0aXZlKG5leHQpKSkgfHwKLSAgICAgICAgKChjY29kZT09VG9rZW4uTkVXTElORSkgJiYKLSAgICAgICAgICgocHJldj09bnVsbCkgfHwgKHByZXYuY29kZT09VG9rZW4uTkVXTElORSkpKSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIGVsc2UgcmV0dXJuIGN1cjsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHRva2VuIGlzIGFmZmVjdGVkIGJ5IHdoaXRlc3BhY2UgcHJlY2VkaW5nIG9yCi0gICAqICBmb2xsb3dpbmcgaXQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gX2lzU3BhY2VTZW5zaXRpdmUoVG9rZW4gdG9rKQotICB7Ci0gICAgaWYgKHRvaz09bnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIGludCBpID0gdG9rLmNvZGU7Ci0gICAgaWYgKChpID09IFRva2VuLk5BTUUpIHx8IChpID09IFRva2VuLk5VTUJFUikgfHwgKGkgPT0gVG9rZW4uUkVTRVJWRUQpIHx8Ci0gICAgICAgIChpID09IFRva2VuLlBFUklPRCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgVG9rZW5SZWFkZXIgX2luOwotICBwcml2YXRlIFRva2VuIF9wcmV2ID0gbnVsbDsKLSAgcHJpdmF0ZSBUb2tlbiBfbmV4dDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbHRlcjIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsdGVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTMzZWUxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsdGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogUmVuYW1lcyBsb2NhbCB2YXJpYWJsZSBuYW1lcyB0byBzaG9ydCBvbmVzCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyMiBpbXBsZW1lbnRzIFRva2VuUmVhZGVyCi17Ci0KLSAgcHVibGljIEZpbHRlcjIoVG9rZW5SZWFkZXIgaW4pCi0gIHsKLSAgICBfaW4gPSBpbjsKLSAgICBSdW5uYWJsZSBydW5uZXIgPSBuZXcgUnVubmFibGUoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiQ29tcHJlc3Nvcjogc3RhcnQ6IitUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgICAgIF9ydW4oKTsKLSAgICAgICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oIkNvbXJlc3NvcjogZW5kOiIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9OwotICAgIG5ldyBUaHJlYWQocnVubmVyKS5zdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgVG9rZW5SZWFkZXIjcmVhZCgpCi0gICAqLwotICBwdWJsaWMgVG9rZW4gcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBfYnVmZmVyLnJlYWQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcnVuKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUb2tlbiBjdXIgPSBfaW4ucmVhZCgpOwotICAgICAgZm9yKDtjdXIhPW51bGw7KQotICAgICAgewotICAgICAgICBfcHJvY2VzcyhjdXIpOwotICAgICAgICBjdXIgPSBfaW4ucmVhZCgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBfYnVmZmVyLndyaXRlKGUpOwotICAgIH0KLSAgICBjYXRjaCAoVG9rZW5FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgX2J1ZmZlci53cml0ZShuZXcgSU9FeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgbGluZToiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRUb2tlbigpLmxpbmVOdW1iZXIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgX2J1ZmZlci53cml0ZShuZXcgSU9FeGNlcHRpb24oKSk7Ci0gICAgfQotICAgIF9idWZmZXIuY2xvc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiByZW5hbWVzIGxvY2FsIHZhcmlhYmxlIG5hbWVzIHRvIHNob3J0IG5hbWVzLgotICAgKiBGaXJzdCBwYXNzLiBzZXRzIGEgZmxhZyBpZiB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIEpTIGV2YWwgbWV0aG9kLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF9wcm9jZXNzKFRva2VuIGN1cikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoKGN1ci5jb2RlID09IFRva2VuLkxFRlRfQlJBQ0UpICYmIChjdXIuY2ggPT0gJ3snKSkKLSAgICAgIF9vcGVuQ3VybHkrKzsKLSAgICBlbHNlIGlmICgoY3VyLmNvZGUgPT0gVG9rZW4uUklHSFRfQlJBQ0UpICYmIChjdXIuY2ggPT0gJ30nKSkKLSAgICAgIF9vcGVuQ3VybHktLTsKLQotCi0gICAgc3dpdGNoKF9zdGF0ZSkKLSAgICB7Ci0gICAgY2FzZSBST09UX01PREUgOgotICAgICAgaWYgKChjdXIuY29kZT09VG9rZW4uUkVTRVJWRUQpICYmIChjdXIuc3RyaW5nLmVxdWFscygiZnVuY3Rpb24iKSkpCi0gICAgICB7Ci0gICAgICAgIF9zdGF0ZSA9IEZVTkNUSU9OX1BBUkFNX01PREU7Ci0gICAgICAgIF9mdW5jdGlvbi5jbGVhcigpOwotICAgICAgICBfaXNGdW5jdGlvblVzaW5nRXZhbCA9IGZhbHNlOwotICAgICAgICBfZnVuY3Rpb24uYWRkKGN1cik7Ci0gICAgICB9Ci0gICAgICBlbHNlIF9idWZmZXIud3JpdGUoY3VyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlVOQ1RJT05fUEFSQU1fTU9ERSA6Ci0gICAgICBfZnVuY3Rpb24uYWRkKGN1cik7Ci0gICAgICBpZiAoKGN1ci5jb2RlPT1Ub2tlbi5MRUZUX0JSQUNFKSAmJiAoY3VyLmNoPT0neycpKQotICAgICAgewotICAgICAgICBfc3RhdGUgPSBGVU5DVElPTl9CT0RZX01PREU7Ci0gICAgICAgIF9iZWdpbkZ1bmN0aW9uID0gX29wZW5DdXJseTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlVOQ1RJT05fQk9EWV9NT0RFIDoKLSAgICAgIF9mdW5jdGlvbi5hZGQoY3VyKTsKLSAgICAgIGlmIChfb3BlbkN1cmx5PF9iZWdpbkZ1bmN0aW9uKQotICAgICAgewotICAgICAgICBfc3RhdGUgPSBST09UX01PREU7Ci0gICAgICAgIGlmIChfaXNGdW5jdGlvblVzaW5nRXZhbCkgX3dyaXRlVG9rZW5zKF9mdW5jdGlvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZvcihpbnQgaT0wLHN6PV9mdW5jdGlvbi5zaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBfcHJvY2VzczIoKFRva2VuKSBfZnVuY3Rpb24uZ2V0KGkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChjdXIuY29kZT09VG9rZW4uTkFNRSkgJiYgY3VyLnN0cmluZy5lcXVhbHMoImV2YWwiKSkKLSAgICAgIHsKLSAgICAgICAgX2lzRnVuY3Rpb25Vc2luZ0V2YWwgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDJuZCBwYXNzCi0gICAqIERvZXMgdGhlIGFjdHVhbCByZW5hbWluZwotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF9wcm9jZXNzMihUb2tlbiBjdXIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKChjdXIuY29kZSA9PSBUb2tlbi5MRUZUX0JSQUNFKSAmJiAoY3VyLmNoID09ICd7JykpCi0gICAgICBfb3BlbkN1cmx5Kys7Ci0gICAgZWxzZSBpZiAoKGN1ci5jb2RlID09IFRva2VuLlJJR0hUX0JSQUNFKSAmJiAoY3VyLmNoID09ICd9JykpCi0gICAgICBfb3BlbkN1cmx5LS07Ci0KLSAgICBzd2l0Y2goX3N0YXRlKQotICAgIHsKLSAgICBjYXNlIFJPT1RfTU9ERSA6Ci0gICAgICBpZiAoKGN1ci5jb2RlPT1Ub2tlbi5SRVNFUlZFRCkgJiYgKGN1ci5zdHJpbmcuZXF1YWxzKCJmdW5jdGlvbiIpKSkKLSAgICAgICAgX3N0YXRlID0gRlVOQ1RJT05fTU9ERTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlVOQ1RJT05fTU9ERSA6Ci0gICAgICBpZiAoKGN1ci5jb2RlPT1Ub2tlbi5MRUZUX0JSQUNFKSAmJiAoY3VyLmNoPT0nKCcpKQotICAgICAgewotICAgICAgICBfc3RhdGUgPSBGVU5DVElPTl9QQVJBTV9NT0RFOwotICAgICAgICBfbG9jYWxWYXJNYXAuY2xlYXIoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ci5jb2RlPT1Ub2tlbi5OQU1FKQotICAgICAgewotICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJmdW5jdGlvbiBuYW1lOyIrY3VyLnN0cmluZyk7Ci0gICAgICAgIF9uYW1lR2VuLnJlc2V0KCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZVTkNUSU9OX1BBUkFNX01PREUgOgotICAgICAgaWYgKChjdXIuY29kZT09VG9rZW4uTEVGVF9CUkFDRSkgJiYgKGN1ci5jaD09J3snKSkKLSAgICAgIHsKLSAgICAgICAgX3N0YXRlID0gRlVOQ1RJT05fQk9EWV9NT0RFOwotICAgICAgICBfYmVnaW5GdW5jdGlvbiA9IF9vcGVuQ3VybHk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdXIuY29kZSA9PSBUb2tlbi5OQU1FKQotICAgICAgewotICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCIgcGFyYW06IitjdXIuc3RyaW5nKTsKLSAgICAgICAgVG9rZW4gdG9rID0gX2dldE5ld1Rva2VuKGN1cik7Ci0gICAgICAgIGN1ciA9IHRvazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlVOQ1RJT05fQk9EWV9NT0RFIDoKLSAgICAgIGlmIChfb3BlbkN1cmx5PF9iZWdpbkZ1bmN0aW9uKQotICAgICAgewotICAgICAgICBfc3RhdGUgPSBST09UX01PREU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdXIuY29kZT09VG9rZW4uUEVSSU9EKQotICAgICAgICBfc3RhdGUgPSBQRVJJT0RfTU9ERTsKLSAgICAgIGVsc2UgaWYgKChjdXIuY29kZT09VG9rZW4uUkVTRVJWRUQpICYmIChjdXIuc3RyaW5nLmVxdWFscygidmFyIikpKQotICAgICAgICBfc3RhdGUgPSBWQVJfREVGX01PREU7Ci0gICAgICBlbHNlIGlmIChjdXIuY29kZT09VG9rZW4uTkFNRSkKLSAgICAgIHsKLSAgICAgICAgY3VyID0gX3N1YnN0Rm9yVG9rZW4oY3VyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVkFSX0RFRl9NT0RFIDoKLSAgICAgIGlmIChjdXIuY29kZT09VG9rZW4uTkFNRSkKLSAgICAgIHsKLSAgICAgICAgX3N0YXRlID0gRlVOQ1RJT05fQk9EWV9NT0RFOwotICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCIgbG9jYWwgdmFyOiIrY3VyLnN0cmluZyk7Ci0gICAgICAgIFRva2VuIHRvayA9IF9nZXROZXdUb2tlbihjdXIpOwotICAgICAgICBjdXIgPSB0b2s7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBFUklPRF9NT0RFIDoKLSAgICAgIC8vIHRoaXMgaXMganVzdCB0byBza2lwIHRoZSBuZXh0IHRva2VuIGFmdGVyIGEgcGVyaW9kLgotICAgICAgX3N0YXRlID0gRlVOQ1RJT05fQk9EWV9NT0RFOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIF9idWZmZXIud3JpdGUoY3VyKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUb2tlbnMoVmVjdG9yIHRva2VucykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBmb3IoaW50IGk9MCxzej10b2tlbnMuc2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgX2J1ZmZlci53cml0ZSgoVG9rZW4pIHRva2Vucy5nZXQoaSkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIGEgbmV3IHRva2VuIHRvIHJlcGxhY2UgdGhlIG9sZCBvbmUgd2l0aC4gdGhlIG5ldyBvbmUgd2lsbCBoYXZlCi0gICAqICBhIHNob3J0IG5hbWUKLSAgICovCi0gIHByaXZhdGUgVG9rZW4gX2dldE5ld1Rva2VuKFRva2VuIG9sZFRva2VuKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBvbGRUb2tlbi5zdHJpbmc7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBfbG9jYWxWYXJNYXAuZ2V0KG9sZE5hbWUpOwotICAgIGlmIChuZXdOYW1lPT1udWxsKQotICAgIHsKLSAgICAgIG5ld05hbWUgPSBfbmFtZUdlbi5nZXROZXh0KCk7Ci0gICAgICBfbG9jYWxWYXJNYXAucHV0KG9sZE5hbWUsIG5ld05hbWUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFRva2VuKG9sZFRva2VuLmNvZGUsIG9sZFRva2VuLmxpbmVOdW1iZXIsIG5ld05hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGUgdG9rZW4uIGlmIG5vIHRva2VuIGhhcyBiZWVuIHN1YnN0aXR1dGVkIGZvciB0aGUKLSAgICogIDxjb2RlPm9sZFRva2VuPC9jb2RlPiB0aGVuIHRoZSA8Y29kZT5vbGRUb2tlbjwvY29kZT4gaXMgcmV0dXJuZWQuCi0gICAqIEBwYXJhbSBvbGRUb2tlbiB0aGUgdG9rZW4gdG8gc3Vic3RpdHV0ZSBmb3IuCi0gICAqLwotICBwcml2YXRlIFRva2VuIF9zdWJzdEZvclRva2VuKFRva2VuIG9sZFRva2VuKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBvbGRUb2tlbi5zdHJpbmc7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBfbG9jYWxWYXJNYXAuZ2V0KG9sZE5hbWUpOwotICAgIGlmIChuZXdOYW1lPT1udWxsKQotICAgIHsKLSAgICAgIGlmIChfbmFtZUdlbi5pc0luVXNlKG9sZE5hbWUpKQotICAgICAgICB0aHJvdyBuZXcgVG9rZW5FeGNlcHRpb24ob2xkVG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uZmxpY3Qgd2l0aCBnbG9iYWwgdmFyOiIrb2xkTmFtZSk7Ci0gICAgICByZXR1cm4gb2xkVG9rZW47Ci0gICAgfQotICAgIFRva2VuIHRvayA9IG5ldyBUb2tlbihvbGRUb2tlbi5jb2RlLCBvbGRUb2tlbi5saW5lTnVtYmVyLCBuZXdOYW1lKTsKLSAgICByZXR1cm4gdG9rOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBOYW1lR2VuCi0gIHsKLSAgICBwcml2YXRlIGludCBfaSA9IDA7Ci0gICAgcHJpdmF0ZSBjaGFyIF9jaCA9ICdhJzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBfc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHVuaXF1ZSBzaG9ydCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROZXh0KCkKLSAgICB7Ci0gICAgICBfc2Iuc2V0TGVuZ3RoKDApOwotICAgICAgcmV0dXJuIF9zYi5hcHBlbmQoX2NoKS5hcHBlbmQoX2krKykudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgX2kgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT52YXJOYW1lPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIHJldHVybmVkIGJ5Ci0gICAgICogICB0aGUgbWV0aG9kIDxjb2RlPmdldE5leHQoKTwvY29kZT4KLSAgICAgKiBAc2VlICNnZXROZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luVXNlKFN0cmluZyB2YXJOYW1lKQotICAgIHsKLSAgICAgIGludCBzej12YXJOYW1lLmxlbmd0aCgpOwotICAgICAgaWYgKCh2YXJOYW1lLmNoYXJBdCgwKSE9X2NoKSB8fCAoc3o8PTEpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvcihpbnQgaT0xOyBpPHN6OyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmICghQ2hhcmFjdGVyLmlzRGlnaXQodmFyTmFtZS5jaGFyQXQoaSkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgaXBhcnQgPSB2YXJOYW1lLnN1YnN0cmluZygxKTsKLSAgICAgIGludCBqID0gSW50ZWdlci5wYXJzZUludChpcGFydCk7Ci0gICAgICBpZiAoaiA+PSBfaSkgcmV0dXJuIGZhbHNlOwotICAgICAgZWxzZSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBfc3RhdGUgPSBST09UX01PREU7Ci0gIHByaXZhdGUgaW50IF9vcGVuQ3VybHkgPSAwOwotICBwcml2YXRlIGludCBfYmVnaW5GdW5jdGlvbiA9IDA7Ci0gIHByaXZhdGUgYm9vbGVhbiBfaXNGdW5jdGlvblVzaW5nRXZhbCA9IGZhbHNlOwotCi0gIHByaXZhdGUgZmluYWwgVG9rZW5SZWFkZXIgX2luOwotICBwcml2YXRlIGZpbmFsIE5hbWVHZW4gX25hbWVHZW4gPSBuZXcgTmFtZUdlbigpOwotICBwcml2YXRlIGZpbmFsIEhhc2hNYXAgX2xvY2FsVmFyTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBmaW5hbCBUb2tlbkJ1ZmZlciBfYnVmZmVyID0gbmV3IFRva2VuQnVmZmVyKCk7Ci0gIHByaXZhdGUgZmluYWwgVmVjdG9yIF9mdW5jdGlvbiA9IG5ldyBWZWN0b3IoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9PVF9NT0RFID0gICAgICAgICAgIDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVU5DVElPTl9NT0RFID0gICAgICAgMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZVTkNUSU9OX1BBUkFNX01PREUgPSAyOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlVOQ1RJT05fQk9EWV9NT0RFID0gIDM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQVJfREVGX01PREUgPSAgICAgICAgNDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBFUklPRF9NT0RFID0gICAgICAgICA1OwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9RdWV1ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9RdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU5NmVhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEltcGxlbWVudHMgYSBmaXJzdC1pbi1maXJzdC1vdXQgKEZJRk8pIHF1ZXVlLiBUeXBpY2FsbHksIG9uZSB0aHJlYWQgd2lsbCBhZGQKLSAqIGVsZW1lbnRzIHRvIHRoaXMgcXVldWUsIGFuZCBhbm90aGVyIHdpbGwgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhpcyBxdWV1ZS4KLSAqIFRoaXMgY2xhc3MgaXMgdGhyZWFkIHNhZmUuCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgUXVldWUKLXsKLSAgLyoqCi0gICAqIEBwYXJhbSBzaXplIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhpcyBxdWV1ZQotICAgKi8KLSAgcHVibGljIFF1ZXVlKGludCBzaXplKQotICB7Ci0gICAgaWYgKHNpemU8PTApCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzaXplIGlzIG5vbnBvc2l0aXZlOiIrc2l6ZSk7Ci0gICAgX2J1ZiA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcXVldWUuIFRoaXMgd2lsbCBuZXZlciBiZSBsYXJnZXIKLSAgICogdGhhbiB0aGUge0BsaW5rICNRdWV1ZShpbnQpIG1heGltdW0gc2l6ZX0gb2YgdGhpcyBxdWV1ZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgaW50IHNpemUoKQotICB7Ci0gICAgcmV0dXJuIF9zaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaGFzIGJlZW4gY2xvc2VkLgotICAgKiBAc2VlICNjbG9zZSgpCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbG9zZWQoKQotICB7Ci0gICAgcmV0dXJuIF9jbG9zZWQ7Ci0gIH0KLQotICAvKioKLSAgICogY2xvc2VzIHRoaXMgcXVldWUuIEFueSBjb25zZXF1ZW50IHtAbGluayAjYWRkKE9iamVjdCl9IG1ldGhvZCBjYWxscyB3aWxsCi0gICAqIGZhaWwuICBBbGwge0BsaW5rICNnZXQoKX0gb3BlcmF0aW9ucyB3aWxsIHN1Y2NlZWQgdW50aWwgdGhlIHF1ZXVlIGlzCi0gICAqIGVtcHR5LiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotICAgKiBAc2VlICNpc0Nsb3NlZCgpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKQotICB7Ci0gICAgX2Nsb3NlZCA9IHRydWU7Ci0gICAgbm90aWZ5QWxsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGFuZCBhIGNhbGwgdG8ge0BsaW5rICNhZGQoT2JqZWN0KX0KLSAgICogd291bGQgYmxvY2suCi0gICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Z1bGwoKQotICB7Ci0gICAgcmV0dXJuIChzaXplKCkgPT0gX2J1Zi5sZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaXMgZW1wdHkgYW5kIGEgY2FsbCB0byB7QGxpbmsgI2dldCgpfQotICAgKiB3b3VsZCBibG9jay4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW1wdHkoKQotICB7Ci0gICAgcmV0dXJuIChzaXplKCkgPT0gMCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGlzIHF1ZXVlLgotICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhpcyBxdWV1ZS4gbnVsbCBpcyBwZXJtaXR0ZWQuCi0gICAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkLgotICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBxdWV1ZSBpcyBjbG9zZWQuCi0gICAqIEBzZWUgI2Nsb3NlKCkKLSAgICogQHNlZSAjcmVtb3ZlKCkKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoT2JqZWN0IG9iaikKLSAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICB7Ci0gICAgZm9yKDtpc0Z1bGwoKSAmJiAoIWlzQ2xvc2VkKCkpOykKLSAgICB7Ci0gICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJ3YWl0aW5nIHRvIGFkZC4gc2l6ZSIpOwotICAgICAgd2FpdCgpOwotICAgIH0KLSAgICAvL3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcuIHNpemU6IitzaXplKCkpOwotCi0gICAgX2NoZWNrSXNDbG9zZWQoKTsKLQotICAgIF9idWZbX2hlYWRdID0gb2JqOwotICAgIF9oZWFkID0gX2luY0luZGV4KF9oZWFkKTsKLSAgICBfc2l6ZSsrOwotICAgIC8vIHllcywgd2UgYXJlIHdha2luZyB1cCBhbGwgdGhyZWFkcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlCi0gICAgLy8gd2FpdGluZyB0byBkbyBhbiBhZGQuIFRoaXMgbWF5IGJlIGluZWZmaWNpZW50LgotICAgIC8vIG5vdGUgdGhhdCB3ZSBtdXN0IGRvIG5vdGlmeUFsbCgpIGFuZCBub3Qgbm90aWZ5KCkKLSAgICBub3RpZnlBbGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgc29tZSBlbGVtZW50IGlzIGFkZGVkIHRvIHRoaXMgcXVldWUsIG9yIHRoZSBxdWV1ZQotICAgKiBpcyBjbG9zZWQuCi0gICAqIEByZXR1cm4gcmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgT2JqZWN0IGF0IHRoZSBmcm9udCBvZiB0aGlzIHF1ZXVlLgotICAgKiBudWxsIG1heSBiZSByZXR1cm5lZCBpZiBudWxsIHdhcyBhZGRlZCB1c2luZyB7QGxpbmsgI2FkZChPYmplY3QpfQotICAgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZC4KLSAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgcXVldWUgaXMgY2xvc2VkLgotICAgKiBAc2VlICNjbG9zZSgpCi0gICAqIEBzZWUgI2FkZChPYmplY3QpCi0gICAqIEBzZWUgI3JlbW92ZShMSXN0LGludCkKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZSgpCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICAgIGZvcig7aXNFbXB0eSgpOykKLSAgICB7Ci0gICAgICBfY2hlY2tJc0Nsb3NlZCgpOwotICAgICAgd2FpdCgpOwotICAgIH0KLQotICAgIE9iamVjdCByZXMgPSBfYnVmW190YWlsXTsKLSAgICBfYnVmW190YWlsXSA9IG51bGw7IC8vIGFsbG93IGdhcmJhZ2UgY29sbGVjdAotICAgIF90YWlsID0gX2luY0luZGV4KF90YWlsKTsKLSAgICBfc2l6ZS0tOwotCi0gICAgLy8geWVzLCB3ZSBhcmUgd2FraW5nIHVwIGFsbCB0aHJlYWRzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUKLSAgICAvLyB3YWl0aW5nIHRvIGRvIGEgcmVtb3ZlLiBUaGlzIG1heSBiZSBpbmVmZmljaWVudC4KLSAgICAvLyBub3RlIHRoYXQgd2UgbXVzdCBkbyBub3RpZnlBbGwoKSBhbmQgbm90IG5vdGlmeSgpCi0gICAgbm90aWZ5QWxsKCk7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmVzIG11bHRpcGxlIGVsZW1lbnRzLiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZXJlIGlzIHNvbWV0aGluZwotICAgKiB0byByZW1vdmUuCi0gICAqIEBwYXJhbSBjb2xsZWN0b3IgYWxsIHRoZSBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhpcyBxdWV1ZSBhcmUgYWRkZWQgdG8KLSAgICogdGhlIGVuZCBvZiB0aGlzIExpc3QuCi0gICAqIEBwYXJhbSBjb3VudCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLiBJZiB0aGlzIGlzIHplcm8sCi0gICAqIHRoZW4gaXQgZGVmYXVsdHMgdG8gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGlzIHF1ZXVlLgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWN0dWFsbHkgcmVtb3ZlZC4KLSAgICogQHNlZSAjcmVtb3ZlKCkKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlbW92ZShMaXN0IGNvbGxlY3RvciwgaW50IGNvdW50KQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gIHsKLSAgICBjb2xsZWN0b3IuYWRkKHJlbW92ZSgpKTsKLQotICAgIGludCBzeiA9IHNpemUoKSsxOwotICAgIGlmICgoY291bnQgPT0gMCkgfHwgKGNvdW50ID4gc3opKQotICAgICAgY291bnQgPSBzejsKLSAgICBlbHNlIGlmIChjb3VudCA8IDApCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VudCBpcyBuZWdhdGl2ZSIpOwotCi0gICAgaW50IHJlYWQgPSAxOwotICAgIHRyeQotICAgIHsKLSAgICAgIGZvcig7cmVhZCA8IGNvdW50OyByZWFkKyspCi0gICAgICB7Ci0gICAgICAgIGNvbGxlY3Rvci5hZGQocmVtb3ZlKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgdXNlciBoYXMgc3ViY2xhc3NlZCByZW1vdmUoKSBhbmQKLSAgICAgIC8vIGRvbmUgc29tZXRoaW5nIHdlaXJkCi0gICAgfQotICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIHVzZXIgaGFzIHN1YmNsYXNzZWQgcmVtb3ZlKCkgYW5kCi0gICAgICAvLyBkb25lIHNvbWV0aGluZyB3ZWlyZAotCi0gICAgICAvLyBtYXJrIHRoaXMgdGhyZWFkIGFzIGludGVycnVwdGVkLCBzbyB0aGF0IGl0IGRvZXNuJ3QgYmxvY2sgYWdhaW4uCi0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVhZDsKLSAgfQotCi0gIHByaXZhdGUgaW50IF9pbmNJbmRleChpbnQgaW5kZXgpCi0gIHsKLSAgICBpbmRleCsrOwotICAgIHJldHVybiAoaW5kZXggPCBfYnVmLmxlbmd0aCkgPyBpbmRleCA6IDA7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX2NoZWNrSXNDbG9zZWQoKQotICB7Ci0gICAgaWYgKGlzQ2xvc2VkKCkpCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJRdWV1ZSBoYXMgYmVlbiBjbG9zZWQiKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0W10gX2J1ZjsKLSAgcHJpdmF0ZSBib29sZWFuIF9jbG9zZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgX3NpemUgPSAwLCBfaGVhZCA9IDAsIF90YWlsID0gMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1JlZHVjZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvUmVkdWNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAyOWU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvUmVkdWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogUmVkdWNlcyBKYXZhU2NyaXB0IGZpbGVzIGJ5IHN0cmlwcGluZyBjb21tZW50cyBhbmQgcmVkdW5kYW50IHdoaXRlc3BhY2UKLSAqIGFuZCByZW5hbWluZyBsb2NhbCB2YXJpYWJsZSBuYW1lcyB0byBzaG9ydGVyIG9uZXMuCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgUmVkdWNlciBleHRlbmRzIEZpbGVQcm9jZXNzb3IKLXsKLSAgLyoqCi0gICAqIGNyZWF0ZXMgYSBuZXcgUmVkdWNlci4KLSAgICogQHBhcmFtIHdoaXRlc3BhY2VDb21tZW50cyBpZiB0cnVlIHJlbW92ZXMgY29tbWVudHMgYW5kIGV4dHJhIHdoaXRlc3BhY2UKLSAgICogQHBhcmFtIGxvY2FsVmFycyBpZiB0cnVlIHJlbmFtZXMgbG9jYWwgdmFyaWFibGUgbmFtZXMgdG8gc2hvcnRlciBvbmVzLgotICAgKi8KLSAgcHVibGljIFJlZHVjZXIoYm9vbGVhbiB3aGl0ZXNwYWNlQ29tbWVudHMsIGJvb2xlYW4gbG9jYWxWYXJzKQotICB7Ci0gICAgc3VwZXIoIi5qcyIsIGZhbHNlKTsKLSAgICBfU1RSSVBfV0hJVEVTUEFDRV9DT01NRU5UUyA9IHdoaXRlc3BhY2VDb21tZW50czsKLSAgICBfUkVOQU1FX0xPQ0FMX1ZBUklBQkxFUyA9IGxvY2FsVmFyczsKLSAgfQotCi0gIHB1YmxpYyBSZWR1Y2VyKCkKLSAgewotICAgIHRoaXModHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogcmVkdWNlcyBhIEphdmFTY3JpcHQgZmlsZS4KLSAgICogQHBhcmFtIGluIHRoZSBzb3VyY2UgdG8gcmVhZCBmcm9tCi0gICAqIEBwYXJhbSBvdXQgdGhlIHNvdXJjZSB0byB3cml0ZSB0aGUgcmVkdWNlZCBmb3JtIHRvCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9jZXNzKEJ1ZmZlcmVkUmVhZGVyIGluLCBQcmludFdyaXRlciBvdXQpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgVG9rZW5SZWFkZXIgdHIgPSBuZXcgVG9rZW5pemVyKGluKTsKLSAgICBpZiAoX1NUUklQX1dISVRFU1BBQ0VfQ09NTUVOVFMpIHRyID0gbmV3IEZpbHRlcjEodHIpOwotICAgIGlmIChfUkVOQU1FX0xPQ0FMX1ZBUklBQkxFUykgdHIgPSBuZXcgRmlsdGVyMih0cik7Ci0gICAgRGV0b2tlbml6ZXIgZGV0b2sgPSBuZXcgRGV0b2tlbml6ZXIob3V0KTsKLSAgICBmb3IoOzspCi0gICAgewotICAgICAgVG9rZW4gdG9rID0gdHIucmVhZCgpOwotICAgICAgaWYgKHRvaz09bnVsbCkgYnJlYWs7Ci0gICAgICBlbHNlIGRldG9rLndyaXRlKHRvayk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgRmlsZVByb2Nlc3NvciNwcm9jZXNzRmlsZShGaWxlLCBGaWxlKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpbGUoRmlsZSBpbiwgRmlsZSBvdXQpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGluKSk7Ci0gICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gIG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihvdXQpKTsKLSAgICBwcm9jZXNzKHJlYWRlciwgd3JpdGVyKTsKLSAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICByZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgX2hlbHAoKQotICB7Ci0gICAgU3RyaW5nIHM7Ci0gICAgcyA9ICJSZWR1Y2VzIEphdmFTY3JpcHQgc291cmNlIGNvZGVcbiIgKwotICAgICAgIlVzYWdlOlxuIiArCi0gICAgICAiamF2YSBvcmFjbGUudWl4LnRvb2xzLnVpeDIyLmphdmFzY3JpcHQuUmVkdWNlciIgKwotICAgICAgIiBbLW5vcmVuYW1lXSBbLXdoaXRlc3BhY2VdIFstaGVscF0gaW5wdXQgb3V0cHV0IFxuIiArCi0gICAgICAiIGlucHV0L291dHB1dCBjYW4gYmUgZWl0aGVyIGZpbGVzIG9yIGRpcmVjdG9yaWVzLlxuIiArCi0gICAgICAiIERpcmVjdG9yaWVzIHdpbGwgYmUgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5LlxuIiArCi0gICAgICAiIE9ubHkgZmlsZXMgd2l0aCBuYW1lcyB0aGF0IGVuZCB3aXRoIC5qcyB3aWxsIGJlIHByb2Nlc3NlZC5cbiIgKwotICAgICAgIiAtbm9yZW5hbWUgcHJldmVudHMgcmVuYW1pbmcgbG9jYWwgdmFyaWFibGVzIHRvIHNob3J0IG9uZXNcbiIgKwotICAgICAgIiAtd2hpdGVzcGFjZSBwcmV2ZW50cyByZW1vdmluZyBjb21tZW50cyBhbmQgZXh0cmEgd2hpdGVzcGFjZVxuIiArCi0gICAgICAiIC1oZWxwIHByaW50cyB0aGlzIG1lc3NhZ2UuIjsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgYm9vbGVhbiByZW5hbWUgPSB0cnVlOwotICAgIGJvb2xlYW4gc3BhY2UgPSB0cnVlOwotCi0gICAgZmluYWwgaW50IHN6ID0gYXJncy5sZW5ndGgtMjsKLQotICAgIGlmIChzejwwKQotICAgIHsKLSAgICAgIF9oZWxwKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yKGludCBpPTA7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgcyA9IGFyZ3NbaV07Ci0gICAgICBpZiAocy5lcXVhbHMoIi1oZWxwIikpIF9oZWxwKCk7Ci0gICAgICBlbHNlIGlmIChzLmVxdWFscygiLW5vcmVuYW1lIikpIHJlbmFtZSA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAocy5lcXVhbHMoIi13aGl0ZXNwYWNlIikpIHNwYWNlID0gZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBvcHRpb246IitzKTsKLSAgICAgICAgX2hlbHAoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIEZpbGUgaW4gPSBuZXcgRmlsZShhcmdzW3N6XSk7Ci0gICAgRmlsZSBvdXQgPSBuZXcgRmlsZShhcmdzW3N6KzFdKTsKLSAgICBSZWR1Y2VyIHJlZHVjZXIgPSBuZXcgUmVkdWNlcihzcGFjZSwgcmVuYW1lKTsKLSAgICByZWR1Y2VyLnByb2Nlc3MoaW4sIG91dCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX1NUUklQX1dISVRFU1BBQ0VfQ09NTUVOVFM7Ci0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfUkVOQU1FX0xPQ0FMX1ZBUklBQkxFUzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjM0MTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLS8qKgotICogVG9rZW5zIGZvciBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgVG9rZW4KLXsKLQotICBwdWJsaWMgVG9rZW4oaW50IGNvZGUsIGludCBsaW5lTnVtYmVyKQotICB7Ci0gICAgdGhpcyhjb2RlLCBsaW5lTnVtYmVyLCAoY2hhcikgMCwgKFN0cmluZykgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4oaW50IGNvZGUsIGludCBsaW5lTnVtYmVyLCBjaGFyIGNoKQotICB7Ci0gICAgdGhpcyhjb2RlLCBsaW5lTnVtYmVyLCBjaCwgKFN0cmluZykgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4oaW50IGNvZGUsIGludCBsaW5lTnVtYmVyLCBTdHJpbmcgcykKLSAgewotICAgIHRoaXMoY29kZSwgbGluZU51bWJlciwgKGNoYXIpIDAsIHMpOwotICB9Ci0KLSAgcHVibGljIFRva2VuKGludCBjb2RlLCBpbnQgbGluZU51bWJlciwgY2hhciBjaCwgU3RyaW5nIHMpCi0gIHsKLSAgICB0aGlzLmNvZGU9Y29kZTsKLSAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgIHRoaXMuY2g9Y2g7Ci0gICAgc3RyaW5nID0gczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJUb2tlbiBjb2RlOiIrY29kZSsiIGxpbmU6IitsaW5lTnVtYmVyKwotICAgICAgIiBjaGFyOiIrY2grIiBzdHJpbmc6IitzdHJpbmc7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGNvZGUsIGxpbmVOdW1iZXI7Ci0gIHB1YmxpYyBmaW5hbCBjaGFyIGNoOwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHN0cmluZzsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0YgPSAgICAgICAgICAgICAgICAgMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVXTElORSA9ICAgICAgICAgICAgIDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSElURVNQQUNFID0gICAgICAgICAgMTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUklPRCA9ICAgICAgICAgICAgICAxMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VNSUNPTE9OID0gICAgICAgICAgIDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVU9URUQgPSAgICAgICAgICAgICAgMjA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUUgPSAgICAgICAgICAgICAgICAzMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSID0gICAgICAgICAgICAgIDQwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UID0gICAgICAgICAgICAgNTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR1VMQVJfRVhQID0gICAgICAgICA2MDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHVUxBUl9FWFBfTU9ESUZJRVIgPTY1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UUk9MID0gICAgICAgICAgICAgMTAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX0JSQUNFID0gICAgICAgICAgMTEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9CUkFDRSA9ICAgICAgICAgMTIwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFUlZFRCA9ICAgICAgICAgICAgMjAwOyAvL3Jlc2VydmVkIHdvcmRzCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuQnVmZmVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyY2MwMzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbkJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgYnVmZmVyIHRvIGhvbGQgVG9rZW4gb2JqZWN0cy4gVG9rZW5zIGNhbiBiZSByZWFkIGZyb20gYW5kIHdyaXR0ZW4gdG8gdGhpcwotICogYnVmZmVyIGFzIGlmIGl0IHdlcmUgYSBxdWV1ZS4gaXQgaXMgdGhyZWFkIHNhZmUuIEJlc3QgaWYgYSBzaW5nbGUgdGhyZWFkIGlzCi0gKiByZWFkaW5nIGFuZCBhIHNpbmdsZSB0aHJlYWQgaXMgd3JpdGluZy4KLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlbkJ1ZmZlciBleHRlbmRzIFF1ZXVlIGltcGxlbWVudHMgVG9rZW5SZWFkZXIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIGJ1ZmZlclNpemUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGlzIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBUb2tlbkJ1ZmZlcihpbnQgYnVmZmVyU2l6ZSkKLSAgewotICAgIHN1cGVyKGJ1ZmZlclNpemUpOwotICB9Ci0KLSAgcHVibGljIFRva2VuQnVmZmVyKCkKLSAgewotICAgIHRoaXMoMTAwKTsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkcyBhIFRva2VuIGZyb20gdGhpcyBidWZmZXIuIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZQotICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGFuZCB0aGlzIGJ1ZmZlciBoYXMgYmVlbiBjbG9zZWQuCi0gICAqIEBzZWUgVG9rZW5SZWFkZXIKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgVG9rZW4gcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIFRva2VuIHRvazsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB0b2sgPSAoVG9rZW4pIHN1cGVyLnJlbW92ZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdG9rID0gbnVsbDsKLSAgICB9Ci0KLSAgICBpZiAodG9rPT1fRVhDRVBUSU9OX1RPS0VOKQotICAgIHsKLSAgICAgIHRocm93IF9nZXRFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRvazsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgaWYgdGhlIGJ1ZmZlciBpcyBmdWxsLgotICAgKiBAcGFyYW0gdG9rIHRoZSB0b2tlbiB0byB3cml0ZSB0byB0aGlzIGJ1ZmZlcgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKFRva2VuIHRvaykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5hZGQodG9rKTsKLSAgfQotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShJT0V4Y2VwdGlvbiBlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIF9zZXRFeGNlcHRpb24oZSk7Ci0gICAgd3JpdGUoX0VYQ0VQVElPTl9UT0tFTik7Ci0gICAgY2xvc2UoKTsKLSAgfQotCi0gIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgX3NldEV4Y2VwdGlvbihJT0V4Y2VwdGlvbiBlKQotICB7Ci0gICAgX2V4Y2VwdGlvbiA9IGU7Ci0gIH0KLQotICBwcml2YXRlIHN5bmNocm9uaXplZCBJT0V4Y2VwdGlvbiBfZ2V0RXhjZXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfZXhjZXB0aW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBfZXhjZXB0aW9uID0gbnVsbDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUb2tlbiBfRVhDRVBUSU9OX1RPS0VOID0gbmV3IFRva2VuKC0xLCAwKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuRXhjZXB0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTBiMDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLS8qKgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFRva2VuRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotICBwcml2YXRlIGZpbmFsIFRva2VuIF90b2tlbjsKLQotICBwdWJsaWMgVG9rZW5FeGNlcHRpb24oVG9rZW4gdG9rZW4sIFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgX3Rva2VuID0gdG9rZW47Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oKQotICB7Ci0gICAgcmV0dXJuIF90b2tlbjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5SZWFkZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4NmE3NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGludGVyZmFjZSBUb2tlblJlYWRlcgotewotCi0gIC8qCi0gICAqIFJlYWRzIGEgVG9rZW4gZnJvbSB0aGlzIHNvdXJjZS4gVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCBkYXRhCi0gICAqIGJlY29tZXMgYXZhaWxhYmxlLgotICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGFuZCBFT0YgaXMgcmVhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuaXplci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3ZWJlNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgVG9rZW5pemVyIGZvciBKYXZhU2NyaXB0IHNvdXJjZSBmaWxlcy4KLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlbml6ZXIgaW1wbGVtZW50cyBUb2tlblJlYWRlcgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gaW4gdXNlZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgSlMgZmlsZQotICAgKi8KLSAgcHVibGljIFRva2VuaXplcihCdWZmZXJlZFJlYWRlciBpbikKLSAgewotICAgIF9pbiA9IGluOwotICAgIFJ1bm5hYmxlIHJ1bm5lciA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJUb2tlbml6ZXI6IHN0YXJ0OiIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7Ci0gICAgICAgICAgX3J1bigpOwotICAgICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oIlRva2VuaXplcjogZW5kOiIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgbmV3IFRocmVhZChydW5uZXIpLnN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZHMgYSBUb2tlbi4gYmxvY2tzIHVudGlsIGEgVG9rZW4gaXMgYXZhaWxhYmxlLgotICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIEVPRiBpcyByZWFjaGVkLgotICAgKi8KLSAgcHVibGljIFRva2VuIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gX291dC5yZWFkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3J1bigpCi0gIHsKLSAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgX3J1bjIoKTsKLSAgICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHBhcnNpbmcgbGluZToiK19saW5lTnVtYmVyKTsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcnVuMigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZm9yKDtfZmlsbEJ1ZmZlcigpOykKLSAgICAgIHsKLSAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gcHJvY2VzcyIpOwotICAgICAgICBfcHJvY2Vzc0J1ZmZlcigpOwotICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJlbmQgcHJvY2VzcyIpOwotICAgICAgfQotICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uRU9GLCBfbGluZU51bWJlcikpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBwYXJzaW5nIGxpbmU6IitfbGluZU51bWJlcik7Ci0gICAgICBfb3V0LndyaXRlKGUpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIF9vdXQud3JpdGUobmV3IElPRXhjZXB0aW9uKCJFeGNlcHRpb24gcGFyc2luZyBsaW5lOiIrX2xpbmVOdW1iZXIpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIF9vdXQuY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3Byb2Nlc3NCdWZmZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIF9vZmZzZXQgPSAwOwotCi0gICAgZm9yKDtfb2Zmc2V0PF9sZW47KQotICAgICAgewotICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiIrX2xpbmVOdW1iZXIrIiBvZmZzZXQ6Iitfb2Zmc2V0KTsKLSAgICAgICAgY2hhciBjaCA9IF9idWZmZXIuY2hhckF0KF9vZmZzZXQrKyk7Ci0gICAgICAgIHN3aXRjaChfc3RhdHVzKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIFJPT1RfTU9ERSA6Ci0gICAgICAgICAgY2FzZSBESVZJU0lPTl9NT0RFIDoKLSAgICAgICAgICAgIF9uZXh0ID0gX3Jvb3RNb2RlKGNoLCBfc3RhdHVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgUkVBRF9XT1JEX01PREUgOgotICAgICAgICAgICAgX25leHQgPSBfcmVhZFdvcmRNb2RlKGNoLCBfc3RhdHVzLCBfc3RyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgUVVPVEUxX01PREUgOgotICAgICAgICAgIGNhc2UgUVVPVEUyX01PREUgOgotICAgICAgICAgICAgX25leHQgPSBfcXVvdGVNb2RlKGNoLCBfc3RhdHVzLCBfcHJldiwgX3N0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIEVTQ0FQRURfQ0hBUl9NT0RFIDoKLSAgICAgICAgICAgIF9zdHIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgX3N0ci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgX25leHQgPSBfcHJldjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgUE9TU0lCTEVfQ09NTUVOVF9NT0RFIDoKLSAgICAgICAgICAgIGlmIChjaD09Jy8nKSBfbmV4dCA9IENPTU1FTlQxX01PREU7Ci0gICAgICAgICAgICBlbHNlIGlmIChjaD09JyonKSBfbmV4dCA9IENPTU1FTlQyX01PREU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfb2Zmc2V0LS07IC8vUm9sbCBCYWNrIG9uZQotICAgICAgICAgICAgICAgIGlmIChfcHJldiA9PSBESVZJU0lPTl9NT0RFKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfd3JpdGVDb250cm9sKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIF9uZXh0ID0gUk9PVF9NT0RFOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX25leHQgPSBSRUdVTEFSX0VYUF9NT0RFOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIENPTU1FTlQxX01PREUgOgotICAgICAgICAgIGNhc2UgQ09NTUVOVDJfTU9ERSA6Ci0gICAgICAgICAgY2FzZSBFTkRfQ09NTUVOVF9NT0RFIDoKLSAgICAgICAgICAgIF9uZXh0ID0gX2NvbW1lbnRNb2RlKGNoLCBfc3RhdHVzLCBfc3RyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgUkVHVUxBUl9FWFBfTU9ERSA6Ci0gICAgICAgICAgICBfbmV4dCA9IF9yZWd1bGFyRXhwTW9kZShjaCwgX3N0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIEVORF9SRUdVTEFSX0VYUF9NT0RFIDoKLSAgICAgICAgICAgIGlmICgoY2g9PSdnJykgfHwgKGNoPT0naScpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uUkVHVUxBUl9FWFBfTU9ESUZJRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gpKTsKLSAgICAgICAgICAgICAgICBfbmV4dCA9IEVORF9SRUdVTEFSX0VYUF9NT0RFOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfb2Zmc2V0LS07IC8vUm9sbGJhY2sKLSAgICAgICAgICAgICAgICBfbmV4dCA9IFJPT1RfTU9ERTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBfcHJldiA9IF9zdGF0dXM7Ci0gICAgICAgIF9zdGF0dXMgPSBfbmV4dDsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IF9yb290TW9kZShjaGFyIGNoLCBpbnQgc3RhdHVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIHN3aXRjaChjaCkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ1wnJyA6Ci0gICAgICAgIHJldHVybiBRVU9URTFfTU9ERTsKLSAgICAgIGNhc2UgJ1wiJyA6Ci0gICAgICAgIHJldHVybiBRVU9URTJfTU9ERTsKLSAgICAgIGNhc2UgJyAnICA6Ci0gICAgICBjYXNlICdcdCcgOgotICAgICAgICBfb3V0LndyaXRlKFdISVRFU1BBQ0UpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgY2FzZSAnXG4nIDoKLSAgICAgICAgX291dC53cml0ZShORVdMSU5FKTsKLSAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgIGNhc2UgJy4nIDoKLSAgICAgICAgX291dC53cml0ZShQRVJJT0QpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgY2FzZSAnOycgOgotICAgICAgICBfb3V0LndyaXRlKFNFTUlDT0xPTik7Ci0gICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICBjYXNlICcoJyA6Ci0gICAgICBjYXNlICd7JyA6Ci0gICAgICBjYXNlICdbJyA6Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLkxFRlRfQlJBQ0UsIF9saW5lTnVtYmVyLCBjaCkpOwotICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgY2FzZSAnKScgOgotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5SSUdIVF9CUkFDRSwgX2xpbmVOdW1iZXIsIGNoKSk7Ci0gICAgICAgIHJldHVybiBESVZJU0lPTl9NT0RFOwotICAgICAgY2FzZSAnfScgOgotICAgICAgY2FzZSAnXScgOgotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5SSUdIVF9CUkFDRSwgX2xpbmVOdW1iZXIsIGNoKSk7Ci0gICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICBjYXNlICcvJyAgOiByZXR1cm4gUE9TU0lCTEVfQ09NTUVOVF9NT0RFOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIGlmIChfaXNBbHBoYU51bWVyaWMoY2gpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIF9vZmZzZXQtLTsgLy9Sb2xsYmFjawotICAgICAgICAgICAgcmV0dXJuIFJFQURfV09SRF9NT0RFOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIF93cml0ZUNvbnRyb2woY2gpOwotICAgICAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBfcmVndWxhckV4cE1vZGUoY2hhciBjaCwgU3RyaW5nQnVmZmVyIHJlZ0V4cCkKLSAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIHN3aXRjaChjaCkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ1xcJyA6Ci0gICAgICAgIHJldHVybiBFU0NBUEVEX0NIQVJfTU9ERTsKLSAgICAgIGNhc2UgJy8nIDoKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uUkVHVUxBUl9FWFAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9saW5lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdFeHAudG9TdHJpbmcoKSkpOwotICAgICAgICByZWdFeHAuc2V0TGVuZ3RoKDApOwotICAgICAgICByZXR1cm4gRU5EX1JFR1VMQVJfRVhQX01PREU7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmVnRXhwLmFwcGVuZChjaCk7Ci0gICAgICAgIHJldHVybiBSRUdVTEFSX0VYUF9NT0RFOwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX3F1b3RlTW9kZShjaGFyIGNoLCBpbnQgc3RhdHVzLCBpbnQgcHJldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcXVvdGVTdHJpbmcpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCgoY2g9PSdcJycpICYmIChzdGF0dXM9PVFVT1RFMV9NT0RFKSkgfHwKLSAgICAgICAgKChjaD09J1wiJykgJiYgKHN0YXR1cz09UVVPVEUyX01PREUpKSkKLSAgICAgIHsKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uUVVPVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbGluZU51bWJlciwgY2gsIHF1b3RlU3RyaW5nLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgcXVvdGVTdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgfQotICAgIGVsc2UgaWYgKGNoPT0nXFwnKSByZXR1cm4gRVNDQVBFRF9DSEFSX01PREU7Ci0gICAgZWxzZQotICAgICAgewotICAgICAgICBxdW90ZVN0cmluZy5hcHBlbmQoY2gpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX2NvbW1lbnRNb2RlKGNoYXIgY2gsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY29tbWVudFN0cmluZykKLSAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIGlmIChzdGF0dXM9PUVORF9DT01NRU5UX01PREUpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaD09Jy8nKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIF93cml0ZUNvbW1lbnQoY29tbWVudFN0cmluZyk7Ci0gICAgICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1lbnRTdHJpbmcuYXBwZW5kKCcqJyk7Ci0gICAgICAgICAgICBfb2Zmc2V0LS07IC8vUm9sbCBiYWNrCi0gICAgICAgICAgICByZXR1cm4gQ09NTUVOVDJfTU9ERTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoKHN0YXR1cz09Q09NTUVOVDJfTU9ERSkgJiYgKGNoPT0nKicpKQotICAgICAgewotICAgICAgICByZXR1cm4gRU5EX0NPTU1FTlRfTU9ERTsKLSAgICAgIH0KLSAgICBlbHNlIGlmICgoc3RhdHVzPT1DT01NRU5UMV9NT0RFKSAmJiAoY2g9PSdcbicpKQotICAgICAgewotICAgICAgICBfd3JpdGVDb21tZW50KGNvbW1lbnRTdHJpbmcpOwotICAgICAgICBfb3V0LndyaXRlKE5FV0xJTkUpOwotICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWVudFN0cmluZy5hcHBlbmQoY2gpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX3JlYWRXb3JkTW9kZShjaGFyIGNoLCBpbnQgc3RhdHVzLCBTdHJpbmdCdWZmZXIgd29yZEJ1ZmZlcikKLSAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIGlmIChfaXNBbHBoYU51bWVyaWMoY2gpKQotICAgICAgewotICAgICAgICB3b3JkQnVmZmVyLmFwcGVuZChjaCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotICAgICAgICBfd3JpdGVBbHBoYU51bWVyaWMod29yZEJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgd29yZEJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIF9vZmZzZXQtLTsgLy9Sb2xsYmFjawotICAgICAgICByZXR1cm4gRElWSVNJT05fTU9ERTsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb21tZW50KFN0cmluZ0J1ZmZlciBzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLkNPTU1FTlQsIF9saW5lTnVtYmVyLCBzLnRvU3RyaW5nKCkpKTsKLSAgICBzLnNldExlbmd0aCgwKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb250cm9sKGNoYXIgY2gpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uQ09OVFJPTCwgX2xpbmVOdW1iZXIsIGNoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQWxwaGFOdW1lcmljKFN0cmluZyBzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChzLmNoYXJBdCgwKSkpCi0gICAgICB7Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLk5VTUJFUiwgX2xpbmVOdW1iZXIsIHMpKTsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChfaXNSZXNlcnZlZEtleXdvcmQocykpCi0gICAgICB7Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLlJFU0VSVkVELCBfbGluZU51bWJlciwgcykpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uTkFNRSwgX2xpbmVOdW1iZXIsIHMpKTsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXNSZXNlcnZlZEtleXdvcmQoU3RyaW5nIHMpCi0gIHsKLSAgICBmb3IoaW50IGk9MDsgaTxyZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAocy5lcXVhbHMocmVzZXJ2ZWRXb3Jkc1tpXSkpIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXNBbHBoYU51bWVyaWMoY2hhciBjaCkKLSAgewotICAgIHJldHVybiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSB8fCAoY2g9PSdfJykgOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gZmFsc2UgaWYgRU9GCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gX2ZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIF9idWZmZXIuc2V0TGVuZ3RoKDApOwotICAgIFN0cmluZyBzID0gX2luLnJlYWRMaW5lKCk7Ci0gICAgaWYgKHM9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIF9sZW49MDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgX2J1ZmZlci5hcHBlbmQocykuYXBwZW5kKCdcbicpOwotICAgICAgICBfbGVuID0gX2J1ZmZlci5sZW5ndGgoKTsKLSAgICAgICAgX2xpbmVOdW1iZXIrKzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3Jlc2V0KCkKLSAgewotICAgIF9zdGF0dXMgPSBfcHJldiA9IF9uZXh0ID0gUk9PVF9NT0RFOwotICAgIF9idWZmZXIuc2V0TGVuZ3RoKDApOwotICAgIF9sZW4gPSBfbGluZU51bWJlciA9IF9vZmZzZXQgPSAwOwotICAgIF93b3JkQnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICBfc3RyLnNldExlbmd0aCgwKTsKLSAgfQotCi0gIHByaXZhdGUgaW50IF9zdGF0dXMgPSBST09UX01PREU7Ci0gIHByaXZhdGUgaW50IF9wcmV2ID0gUk9PVF9NT0RFOwotICBwcml2YXRlIGludCBfbmV4dCA9IFJPT1RfTU9ERTsKLQotICBwcml2YXRlIGludCBfbGVuID0gMDsKLSAgcHJpdmF0ZSBpbnQgX2xpbmVOdW1iZXIgPSAwOwotICBwcml2YXRlIGludCBfb2Zmc2V0ID0gMDsKLQotICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBfYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBfd29yZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgX3N0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICBwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIF9pbjsKLSAgcHJpdmF0ZSBmaW5hbCBUb2tlbkJ1ZmZlciBfb3V0ID0gbmV3IFRva2VuQnVmZmVyKCk7Ci0KLSAgLyoqCi0gICAqIFRoZXNlIGFyZSBub3QgYWxsIHRoZSByZXNlcnZlZCB3b3JkcyBpbiBKUyBidXQgYXJlIHRoZSBvbmx5IG9uZXMKLSAgICogaW1wb3J0YW50IHRvIHRoZSBmaWx0ZXJzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gcmVzZXJ2ZWRXb3JkcyA9Ci0gIHsKLSAgICAiZnVuY3Rpb24iLCAidmFyIgotICB9OwotCi0gIHByaXZhdGUgZmluYWwgVG9rZW4gTkVXTElORSA9IG5ldyBUb2tlbihUb2tlbi5ORVdMSU5FLCAwKTsKLSAgcHJpdmF0ZSBmaW5hbCBUb2tlbiBXSElURVNQQUNFID0gbmV3IFRva2VuKFRva2VuLldISVRFU1BBQ0UsIDApOwotICBwcml2YXRlIGZpbmFsIFRva2VuIFBFUklPRCA9IG5ldyBUb2tlbihUb2tlbi5QRVJJT0QsIDApOwotICBwcml2YXRlIGZpbmFsIFRva2VuIFNFTUlDT0xPTiA9IG5ldyBUb2tlbihUb2tlbi5TRU1JQ09MT04sIDApOwotCi0gIC8qKgotICAgKiBUaGVzZSBhcmUgdGhlIEZTTSBzdGF0ZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST09UX01PREUgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9XT1JEX01PREUgPSAxMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJVklTSU9OX01PREUgPSAxNTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFFVT1RFMV9NT0RFID0gMjA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRVU9URTJfTU9ERSA9IDMwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVNDQVBFRF9DSEFSX01PREUgPSA0MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU1NJQkxFX0NPTU1FTlRfTU9ERSA9IDUwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVDFfTU9ERSA9IDYwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVDJfTU9ERSA9IDcwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0NPTU1FTlRfTU9ERSA9IDgwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVHVUxBUl9FWFBfTU9ERSA9IDkwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX1JFR1VMQVJfRVhQX01PREUgPSA5NTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzA0MGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0Ci0gIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtamRldi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBKRGV2IFBsdWdpbjwvbmFtZT4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnN0YXg8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMF9yYzItZGV2PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci9KRGV2ZWxvcGVyTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci9KRGV2ZWxvcGVyTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc4NTdhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvSkRldmVsb3Blck1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamRldmVsb3BlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5EZXBlbmRlbmN5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhwcDNEb207Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tQnVpbGRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhwcDNEb21Xcml0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5wdWxsLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLSAgLyoKLSAgICogSW1wb3J0YW50IGluZm9ybWF0aW9uYWwgbm90ZToKLSAgICoKLSAgICogVGhlIGZvbGxvd2luZyBYTUwgY29kZSBpcyBzaW1pbGFyIHRvIHdoYXQgd291bGQgYmUgc2VlbiBpbiBhIHBvbSBmaWxlCi0gICAqIHVuZGVyIHRoZSBtYXZlbi1qZGV2LXBsdWdpbiB0YWcgaWYgTGlicmFyaWVzIChlLmcuIEpTUCBSdW50aW1lCi0gICAqIGFuZCBKU0YgMS4yKSBhbmQgRGlzdHJpYnV0ZWQgVGFnIExpYnJhcmllcyB3YW50ZWQgdG8gYmUgYWRkZWQgdG8gdGhlIC5qcHIKLSAgICogcHJvamVjdC4KLSAgICoKLSAgICogV2hhdCB5b3Ugc2VlIGJlbG93IGFyZSB0aGUgZGVmYXVsdHMgdGhhdCBhcmUgcHV0IGluIGEgcHJvamVjdCdzIC5qcHIKLSAgICogYXV0b21hdGljYWxseSB3aXRob3V0IHNwZWNpZnlpbmcgYW55dGhpbmcuICBTZWUgcmVwbGFjZUxpYnJhcmllcygpLAotICAgKiByZXBsYWNlVGFnTGlicmFyaWVzKCkgYW5kIHJlcGxhY2VEZWZhdWx0VGFnTGlicmFyaWVzKCkuCi0gICAqCi0gICAqIEFsc28gbm90ZSB0aGF0IGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5ICJqZGV2LnBsdWdpbi5hZGQubGlicmFyaWVzIiB0bwotICAgKiBmYWxzZSBpbiBhIHByb2plY3QncyBwb20ueG1sIGZpbGUsIG5vIGxpYnJhcmllcyB3aWxsIGJlIGFkZGVkLCBkZWZhdWx0Ci0gICAqIG9yIG90aGVyd2lzZS4gIEluIGtpbmQsIHNldHRpbmcgdGhlIHByb3BlcnR5ICJqZGV2LnBsdWdpbi5hZGQudGFnbGlicyIKLSAgICogdG8gZmFsc2Ugd2lsbCByZXN1bHQgaW4gbm8gdGFnIGxpYnJhcmllcyBvZiBhbnkga2luZCBiZWluZyBhZGRlZC4KLSAgICoKLSAgICogQXMgeW91IHdvdWxkIGV4cGVjdCwgdGhlIGRlZmF1bHQgZm9yIGJvdGggb2YgdGhlc2UgcHJvcGVydGllcyBpcyAidHJ1ZSIuCi0gICAqCi0gICAqICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkYnVpbGQ8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpkZXYtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxsaWJyYXJpZXM+Ci0gICAgICAgICAgICA8bGlicmFyeT5KU1AgUnVudGltZTwvbGlicmFyeT4KLSAgICAgICAgICAgIDxsaWJyYXJ5PkpTRiAxLjI8L2xpYnJhcnk+Ci0gICAgICAgICAgPC9saWJyYXJpZXM+Ci0gICAgICAgICAgPGRpc3RyaWJ1dGVkVGFnTGlicmFyaWVzPgotICAgICAgICAgICAgPGRpc3RyaWJ1dGVkVGFnTGlicmFyeT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPm5hbWU8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPkpTRiBIVE1MPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPnZlcnNpb248L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPjEuMjwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT5qc3BWZXJzaW9uPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT4yLjE8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+dGxkPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT5odG1sX2Jhc2ljLnRsZDwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT5VUkk8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPmh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWw8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9kaXN0cmlidXRlZFRhZ0xpYnJhcnk+Ci0gICAgICAgICAgICA8ZGlzdHJpYnV0ZWRUYWdMaWJyYXJ5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+SlNGIENvcmU8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+dmVyc2lvbjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+MS4yPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPmpzcFZlcnNpb248L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPjIuMTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT50bGQ8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPmpzZl9jb3JlLnRsZDwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT5VUkk8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPmh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmU8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9kaXN0cmlidXRlZFRhZ0xpYnJhcnk+Ci0gICAgICAgICAgPC9kaXN0cmlidXRlZFRhZ0xpYnJhcmllcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gKi8KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIEpEZXZlbG9wZXIgV29ya3NwYWNlIGFuZCBQcm9qZWN0cwotICogZnJvbSBhIG1hdmVuIGRldmVsb3BtZW50IGVudmlyb25tZW50LgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgamRldgotICogQGV4ZWN1dGUgcGhhc2U9cHJvY2Vzcy1yZXNvdXJjZXMKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHRlc3QKLSAqIEBkZXNjcmlwdGlvbiBHb2FsIHdoaWNoIGdlbmVyYXRlcyB0aGUgSkRldmVsb3BlciBXb3Jrc3BhY2UgYW5kIFByb2plY3RzCi0gKiAgICAgICAgICAgICAgZnJvbSBhIG1hdmVuIGRldmVsb3BtZW50IGVudmlyb25tZW50LgotICovCi1wdWJsaWMgY2xhc3MgSkRldmVsb3Blck1vam8KLSAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgLyoqCi0gICAqIExpYnJhcmllcyB0byBpbmNsdWRlIGluIENsYXNzcGF0aC4KLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdbXSBsaWJyYXJpZXM7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2Ygc291cmNlIHJvb3QgZGlyZWN0b3JpZXMKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlW10gc291cmNlUm9vdHM7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2Ygc291cmNlIHJvb3QgZGlyZWN0b3JpZXMgZm9yIHRoZSB0ZXN0IHByb2plY3QKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlW10gdGVzdFNvdXJjZVJvb3RzOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHJlc291cmNlIHJvb3QgZGlyZWN0b3JpZXMKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlW10gcmVzb3VyY2VSb290czsKLQotICAvKioKLSAgICogTGlzdCBvZiByZXNvdXJjZSByb290IGRpcmVjdG9yaWVzIGZvciB0aGUgdGVzdCBwcm9qZWN0Ci0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgRmlsZVtdIHRlc3RSZXNvdXJjZVJvb3RzOwotCi0gIC8qKgotICAgKiBGb3JjZSB0aGUgTW9qbyB0byB1c2UgdGhlIGRlZmF1bHQgcHJvamVjdC54bWwgb3IKLSAgICogd29ya3NwYWNlLnhtbCBmaWxlIHRvIGJlIHVzZWQgaW4gY3JlYXRpb24gb2YgdGhlCi0gICAqIHdvcmtzcGFjZSBmaWxlICguandzKSBvciBwcm9qZWN0IGZpbGUgKC5qcHIpLiBPdGhlcndpc2UsCi0gICAqIGlmIGEgLmp3cyBvciAuanByIGV4aXN0cywgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQuCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtmb3JjZX0iIGRlZmF1bHQtdmFsdWU9ZmFsc2UKLSAgICoKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLQotICAvKioKLSAgICogQ29tcGlsZXIgdG8gYmUgdXNlZCBieSBKRGV2ZWxvcGVyLiAiT2pjIiBpcyB0aGUgZGVmYXVsdC4gIAotICAgKiBJZiB0aGlzIHBhcmFtZXRlciBpcyBhYnNlbnQgb3IgYW55dGhpbmcgb3RoZXIgdGhhbiAiSmF2YWMiLCAiT2pjIiB3aWxsCi0gICAqIGJlIHVzZWQuCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2LmNvbXBpbGVyfSIgZGVmYXVsdC12YWx1ZT0iT2pjIgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXI7Ci0KLSAgLyoqCi0gICAqIE1ha2UgdGhlIGVudGlyZSBwcm9qZWN0IGJlZm9yZSBlYWNoIHJ1bi4gIFJ1bm5pbmcgYW55dGhpbmcgaW4gdGhlCi0gICAqIHByb2plY3Qgd2lsbCBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgYSBtYWtlIG9mIHRoZSBlbnRpcmUgcHJvamVjdAotICAgKiBmb2xsb3dlZCBieSB0aGUgcnVuLgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7amRldi5tYWtlLnByb2plY3R9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBtYWtlUHJvamVjdDsKLQotICAvKioKLSAgICogRGVmYXVsdCBmaWxlIHRvIGJlIHJ1biB3aGVuIEpEZXZlbG9wZXIgcHJvamVjdCBpcyBydW4uCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2LnJ1bi50YXJnZXR9IgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcnVuVGFyZ2V0OwotCi0gIC8qKgotICAgKiBDcmVhdGUgSkRldmVsb3BlciBXb3Jrc3BhY2UgYW5kIFByb2plY3QgRmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvCi0gICAqIHRoZSBmb3JtYXQgdXNlZAotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7amRldi5yZWxlYXNlfSIgZGVmYXVsdC12YWx1ZT0iMTAuMS4zLjAuNCIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlbGVhc2U7Ci0KLSAgLyoqCi0gICAqIE5hbWUgb2YgdGhlIE1hdmVuIFByb2plY3QKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHJlYWN0b3JQcm9qZWN0cwotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cmVhY3RvclByb2plY3RzfSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IHJlYWN0b3JQcm9qZWN0czsKLQotICAvKioKLSAgICogVGFnIGxpYnJhcnkgZGlyZWN0b3J5IHVzZWQgYnkgZWFjaCBkaXN0cmlidXRlZCB0YWcgbGlicmFyeQotICAgKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7amRldi50YWcubGliLmRpcn0iCi0gICAqICAgICAgICAgICAgZGVmYXVsdC12YWx1ZT0iQG9yYWNsZS5ob21lQGxpYi9qYXZhL3NoYXJlZC9vcmFjbGUuanNmLzEuMi9qc2YtcmkuamFyIS9NRVRBLUlORiIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhZ0xpYkRpcmVjdG9yeTsKLQotICAvKioKLSAgICogVGFnIGxpYnJhcmllcyBhbmQgdGhlaXIgcHJvcGVydGllcy4KLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBQcm9wZXJ0aWVzW10gZGlzdHJpYnV0ZWRUYWdMaWJyYXJpZXM7Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgX3BhcnNlUmVsZWFzZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGdlbmVyYXRlV29ya3NwYWNlKCk7Ci0gICAgICBnZW5lcmF0ZVByb2plY3QoKTsKLSAgICAgIGdlbmVyYXRlVGVzdFByb2plY3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVdvcmtzcGFjZSgpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIXByb2plY3QuZ2V0Q29sbGVjdGVkUHJvamVjdHMoKS5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBKRGV2ZWxvcGVyICIgKyByZWxlYXNlICsgIiB3b3Jrc3BhY2U6ICIgKwotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0KLSAgICAgIEZpbGUgd29ya3NwYWNlRmlsZSA9IGdldEpXb3Jrc3BhY2VGaWxlKHByb2plY3QpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgWHBwM0RvbSB3b3Jrc3BhY2VET00gPSByZWFkV29ya3NwYWNlRE9NKHdvcmtzcGFjZUZpbGUpOwotICAgICAgICByZXBsYWNlUHJvamVjdHMod29ya3NwYWNlRmlsZS5nZXRQYXJlbnRGaWxlKCksIHdvcmtzcGFjZURPTSk7Ci0gICAgICAgIHdyaXRlRE9NKHdvcmtzcGFjZUZpbGUsIHdvcmtzcGFjZURPTSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyB3b3Jrc3BhY2UiLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVQcm9qZWN0KCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIGlmICghInBvbSIuZXF1YWxzKHByb2plY3QuZ2V0UGFja2FnaW5nKCkpKQotICAgIHsKLSAgICAgIEZpbGUgcHJvamVjdEZpbGUgPSBnZXRKUHJvamVjdEZpbGUocHJvamVjdCk7Ci0KLSAgICAgIC8vIEdldCBQcm9qZWN0IFByb3BlcnRpZXMgdG8gdGVsbCBNb2pvIHdoZXRoZXIgb3Igbm90IHRvIGFkZAotICAgICAgLy8gbGlicmFyeSByZWZzIGFuZCB0YWdsaWJzIHRvIHRoZSBwcm9qZWN0LgotICAgICAgUHJvcGVydGllcyBwcm9wcyA9IHByb2plY3QuZ2V0UHJvcGVydGllcygpOwotICAgICAgU3RyaW5nIGFkZExpYnMgPSAoU3RyaW5nKXByb3BzLmdldChfUFJPUEVSVFlfQUREX0xJQlJBUlkpOwotICAgICAgU3RyaW5nIGFkZFRhZ0xpYnMgPSAoU3RyaW5nKXByb3BzLmdldChfUFJPUEVSVFlfQUREX1RBR0xJQlMpOwotICAgICAgX2FkZExpYnJhcmllcyA9IChhZGRMaWJzID09IG51bGwpCi0gICAgICAgID8gdHJ1ZSA6IChuZXcgQm9vbGVhbihhZGRMaWJzKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICBfYWRkVGFnTGlicyAgID0gKGFkZFRhZ0xpYnMgPT0gbnVsbCkKLSAgICAgICAgPyB0cnVlIDogKG5ldyBCb29sZWFuKGFkZFRhZ0xpYnMpKS5ib29sZWFuVmFsdWUoKTsKLQotICAgICAgLy8gVE9ETzogcmVhZCBjb25maWd1cmF0aW9uIGZvciB3YXI6d2FyIGdvYWwKLSAgICAgIEZpbGUgd2ViYXBwRGlyID0gbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJzcmMvbWFpbi93ZWJhcHAiKTsKLSAgICAgIC8vIFRPRE86IHJlYWQgY29uZmlndXJhdGlvbiBmb3IgY29tcGlsZXI6Y29tcGxpZSBnb2FsCi0gICAgICBGaWxlIG91dHB1dERpciA9Ci0gICAgICAgIG5ldyBGaWxlKHByb2plY3QuZ2V0QnVpbGQoKS5nZXREaXJlY3RvcnkoKSwgImNsYXNzZXMiKTsKLQotICAgICAgTWF2ZW5Qcm9qZWN0IGV4ZWN1dGlvblByb2plY3QgPSBwcm9qZWN0LmdldEV4ZWN1dGlvblByb2plY3QoKTsKLSAgICAgIExpc3QgY29tcGlsZVNvdXJjZVJvb3RzID0gZXhlY3V0aW9uUHJvamVjdC5nZXRDb21waWxlU291cmNlUm9vdHMoKTsKLSAgICAgIGlmIChzb3VyY2VSb290cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJvb3RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgY29tcGlsZVNvdXJjZVJvb3RzLmFkZChzb3VyY2VSb290c1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgTGlzdCBjb21waWxlUmVzb3VyY2VSb290cyA9IGV4ZWN1dGlvblByb2plY3QuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICBpZiAocmVzb3VyY2VSb290cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlUm9vdHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOwotICAgICAgICAgIHJlc291cmNlLnNldERpcmVjdG9yeShyZXNvdXJjZVJvb3RzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICBjb21waWxlUmVzb3VyY2VSb290cy5hZGQocmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgSkRldmVsb3BlciAiICsgcmVsZWFzZSArICIgUHJvamVjdCAiICsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOwotCi0gICAgICBTZXQgcGx1Z2luQXJ0aWZhY3RzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICAgIHBsdWdpbkFydGlmYWN0cy5hZGRBbGwocHJvamVjdC5nZXRQbHVnaW5BcnRpZmFjdHMoKSk7Ci0KLSAgICAgIC8vIE5vdGU6IGluY2x1ZGUgImNvbXBpbGUiLCAicHJvdmlkZWQiLCAic3lzdGVtIiBhbmQgInJ1bnRpbWUiIHNjb3BlcwotICAgICAgU2V0IGNvbXBpbGVBcnRpZmFjdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgY29tcGlsZUFydGlmYWN0cy5hZGRBbGwocHJvamVjdC5nZXRDb21waWxlQXJ0aWZhY3RzKCkpOwotICAgICAgY29tcGlsZUFydGlmYWN0cy5hZGRBbGwocHJvamVjdC5nZXRSdW50aW1lQXJ0aWZhY3RzKCkpOwotCi0gICAgICAvLyBOb3RlOiBzZXBhcmF0ZSAicnVudGltZSIgdnMuICJjb21waWxlIiBkZXBlbmRlbmNpZXMgaW4gSkRldmVsb3Blcj8KLSAgICAgIGdlbmVyYXRlUHJvamVjdChwcm9qZWN0RmlsZSwgcHJvamVjdC5nZXRBcnRpZmFjdElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRQYWNrYWdpbmcoKSwgcHJvamVjdC5nZXREZXBlbmRlbmNpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0KGNvbXBpbGVBcnRpZmFjdHMpLCBjb21waWxlU291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVJlc291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh3ZWJhcHBEaXIuZ2V0UGF0aCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVRlc3RQcm9qZWN0KCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIGlmICghInBvbSIuZXF1YWxzKHByb2plY3QuZ2V0UGFja2FnaW5nKCkpKQotICAgIHsKLSAgICAgIEZpbGUgcHJvamVjdEZpbGUgPSBnZXRKUHJvamVjdFRlc3RGaWxlKHByb2plY3QpOwotCi0gICAgICAvLyBHZXQgUHJvamVjdCBQcm9wZXJ0aWVzIHRvIHRlbGwgTW9qbyB3aGV0aGVyIG9yIG5vdCB0byBhZGQKLSAgICAgIC8vIGxpYnJhcnkgcmVmcyBhbmQgdGFnbGlicyB0byB0aGUgcHJvamVjdC4KLSAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBwcm9qZWN0LmdldFByb3BlcnRpZXMoKTsKLSAgICAgIFN0cmluZyBhZGRMaWJzID0gKFN0cmluZylwcm9wcy5nZXQoX1BST1BFUlRZX0FERF9MSUJSQVJZKTsKLSAgICAgIFN0cmluZyBhZGRUYWdMaWJzID0gKFN0cmluZylwcm9wcy5nZXQoX1BST1BFUlRZX0FERF9UQUdMSUJTKTsKLSAgICAgIF9hZGRMaWJyYXJpZXMgPSAoYWRkTGlicyA9PSBudWxsKQotICAgICAgICA/IHRydWUgOiAobmV3IEJvb2xlYW4oYWRkTGlicykpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgX2FkZFRhZ0xpYnMgICA9IChhZGRUYWdMaWJzID09IG51bGwpCi0gICAgICAgID8gdHJ1ZSA6IChuZXcgQm9vbGVhbihhZGRUYWdMaWJzKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICBGaWxlIHdlYmFwcERpciA9IG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCAic3JjL3Rlc3Qvd2ViYXBwIik7Ci0gICAgICAvLyBUT0RPOiByZWFkIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBpbGVyOnRlc3RDb21waWxlIGdvYWwKLSAgICAgIEZpbGUgb3V0cHV0RGlyID0KLSAgICAgICAgbmV3IEZpbGUocHJvamVjdC5nZXRCdWlsZCgpLmdldERpcmVjdG9yeSgpLCAidGVzdC1jbGFzc2VzIik7Ci0KLSAgICAgIC8vIHNlbGYgZGVwZW5kZW5jeSBuZWVkZWQgZm9yIHRlc3QgcHJvamVjdAotICAgICAgTGlzdCB0ZXN0RGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdChwcm9qZWN0LmdldFRlc3REZXBlbmRlbmNpZXMoKSk7Ci0gICAgICBEZXBlbmRlbmN5IHNlbGZEZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3koKTsKLSAgICAgIHNlbGZEZXBlbmRlbmN5LnNldEFydGlmYWN0SWQocHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgc2VsZkRlcGVuZGVuY3kuc2V0R3JvdXBJZChwcm9qZWN0LmdldEdyb3VwSWQoKSk7Ci0gICAgICBzZWxmRGVwZW5kZW5jeS5zZXRUeXBlKHByb2plY3QuZ2V0UGFja2FnaW5nKCkpOwotICAgICAgdGVzdERlcGVuZGVuY2llcy5hZGQoc2VsZkRlcGVuZGVuY3kpOwotCi0gICAgICBNYXZlblByb2plY3QgZXhlY3V0aW9uUHJvamVjdCA9IHByb2plY3QuZ2V0RXhlY3V0aW9uUHJvamVjdCgpOwotICAgICAgTGlzdCBjb21waWxlU291cmNlUm9vdHMgPQotICAgICAgICBleGVjdXRpb25Qcm9qZWN0LmdldFRlc3RDb21waWxlU291cmNlUm9vdHMoKTsKLQotICAgICAgaWYgKHRlc3RTb3VyY2VSb290cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RTb3VyY2VSb290cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGNvbXBpbGVTb3VyY2VSb290cy5hZGQodGVzdFNvdXJjZVJvb3RzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBMaXN0IGNvbXBpbGVSZXNvdXJjZVJvb3RzID0gZXhlY3V0aW9uUHJvamVjdC5nZXRUZXN0UmVzb3VyY2VzKCk7Ci0gICAgICBpZiAodGVzdFJlc291cmNlUm9vdHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0UmVzb3VyY2VSb290cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7Ci0gICAgICAgICAgcmVzb3VyY2Uuc2V0RGlyZWN0b3J5KHRlc3RTb3VyY2VSb290c1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgY29tcGlsZVJlc291cmNlUm9vdHMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIEpEZXZlbG9wZXIgIiArIHJlbGVhc2UgKyAiIFByb2plY3QgIiArCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi10ZXN0Iik7Ci0KLSAgICAgIC8vIE5vdGU6IGFsbCBhcnRpZmFjdHMgaW1wbGljaXRseSBpbmNsdWRlZCBpbiAidGVzdCIgc2NvcGUKLSAgICAgIGdlbmVyYXRlUHJvamVjdChwcm9qZWN0RmlsZSwgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiLXRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0UGFja2FnaW5nKCksIHRlc3REZXBlbmRlbmNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRUZXN0QXJ0aWZhY3RzKCksIGNvbXBpbGVTb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICBjb21waWxlUmVzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHdlYmFwcERpci5nZXRQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUHJvamVjdChGaWxlIHByb2plY3RGaWxlLCBTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2luZywgTGlzdCBkZXBlbmRlbmNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBhcnRpZmFjdHMsIExpc3Qgc291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCByZXNvdXJjZVJvb3RzLCBMaXN0IHdlYlNvdXJjZVJvb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0RGlyKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBwcm9qZWN0RGlyID0gcHJvamVjdEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgWHBwM0RvbSBwcm9qZWN0RE9NID0gcmVhZFByb2plY3RET00ocHJvamVjdEZpbGUpOwotICAgICAgcmVwbGFjZVdlYmFwcEluZm8ocHJvamVjdE5hbWUsIHByb2plY3RET00pOwotICAgICAgcmVwbGFjZVNvdXJjZVBhdGhzKHByb2plY3REaXIsIHNvdXJjZVJvb3RzLCByZXNvdXJjZVJvb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RET00pOwotICAgICAgLy9yZXBsYWNlUmVzb3VyY2VQYXRocyhwcm9qZWN0RGlyLCByZXNvdXJjZVJvb3RzLCBwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VXZWJTb3VyY2VQYXRocyhwcm9qZWN0RGlyLCB3ZWJTb3VyY2VSb290cywgcHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlRGVwZW5kZW5jaWVzKHByb2plY3REaXIsIGRlcGVuZGVuY2llcywgcHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlTGlicmFyaWVzKHByb2plY3REaXIsIGFydGlmYWN0cywgcHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlVGFnTGlicmFyaWVzKHByb2plY3RET00pOwotICAgICAgcmVwbGFjZU91dHB1dERpcmVjdG9yeShwcm9qZWN0RGlyLCBvdXRwdXREaXIsIHByb2plY3RET00pOwotICAgICAgcmVwbGFjZVBhcmFtZXRlcnMocHJvamVjdE5hbWUsIHByb2plY3RET00pOwotICAgICAgd3JpdGVET00ocHJvamVjdEZpbGUsIHByb2plY3RET00pOwotCi0gICAgICBpZiAoIndhciIuZXF1YWxzKHBhY2thZ2luZykpCi0gICAgICB7Ci0gICAgICAgIGNvcHlUYWdMaWJyYXJpZXMocHJvamVjdERpciwgZGVwZW5kZW5jaWVzLCBhcnRpZmFjdHMpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHByb2plY3QiLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVByb2plY3RzKEZpbGUgd29ya3NwYWNlRGlyLCBYcHAzRG9tIHdvcmtzcGFjZURPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2p3czp3b3Jrc3BhY2UKLSAgICAvLyAgIC9saXN0W0BuPSJsaXN0T2ZDaGlsZHJlbiJdCi0gICAgWHBwM0RvbSBzb3VyY2VET00gPSB3b3Jrc3BhY2VET00uZ2V0Q2hpbGQoImxpc3QiKTsKLQotICAgIC8vIDxoYXNoPgotICAgIC8vICAgPHZhbHVlIG49Im5vZGVDbGFzcyIgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSlByb2plY3QiLz4KLSAgICAvLyAgIDx1cmwgbj0iVVJMIiBwYXRoPSJbd29ya3NwYWNlLXJlbGF0aXZlLXBhdGgtdG8tcHJvamVjdC5qcHJdIi8+Ci0gICAgLy8gPC9oYXNoPgotICAgIFhwcDNEb20gdGFyZ2V0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb2plY3QuZ2V0Q29sbGVjdGVkUHJvamVjdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE1hdmVuUHJvamVjdCBjb2xsZWN0ZWRQcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgaS5uZXh0KCk7Ci0KLSAgICAgIC8vIGlmIGEgY2hpbGQgcHJvamVjdCBpcyBhbHNvIGEgd29ya3NwYWNlLCB0aGVuIGRvbid0IAotICAgICAgLy8gcHV0IGl0IGluIHRoZSAuandzIGZpbGUuICBJdCB3aWxsIGhhdmUgaXRzIG93biAuandzCi0gICAgICAvLyBmaWxlLgotICAgICAgaWYgKCEicG9tIi5lcXVhbHMoY29sbGVjdGVkUHJvamVjdC5nZXRQYWNrYWdpbmcoKSkpCi0gICAgICB7Ci0gICAgICAgIEZpbGUgcHJvamVjdEZpbGUgPSBnZXRKUHJvamVjdEZpbGUoY29sbGVjdGVkUHJvamVjdCk7Ci0gICAgICAgIAotICAgICAgICB0YXJnZXRET00uYWRkQ2hpbGQoY3JlYXRlUHJvamVjdFJlZmVyZW5jZURPTSh3b3Jrc3BhY2VEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RGaWxlKSk7Ci0gIAotICAgICAgICBGaWxlIHRlc3RQcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0VGVzdEZpbGUoY29sbGVjdGVkUHJvamVjdCk7Ci0gICAgICAgIHRhcmdldERPTS5hZGRDaGlsZChjcmVhdGVQcm9qZWN0UmVmZXJlbmNlRE9NKHdvcmtzcGFjZURpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFByb2plY3RGaWxlKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogdXNlIGEgYmV0dGVyIG1lcmdlIGFsZ29yaXRobQotICAgIHJlbW92ZUNoaWxkcmVuKHNvdXJjZURPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlRE9NLCB0YXJnZXRET00sIEJvb2xlYW4uRkFMU0UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VXZWJTb3VyY2VQYXRocyhGaWxlIHByb2plY3REaXIsIExpc3Qgc291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvanByOnByb2plY3QKLSAgICAvLyAgIC9oYXNoW0BuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiXQotICAgIC8vICAgICAvaGFzaFtAbj0id2ViQ29udGVudFNldCJdCi0gICAgLy8gICAgICAgL2xpc3RbQG49InVybC1wYXRoIl0KLSAgICBYcHAzRG9tIHBhdGhzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyIpOwotICAgIFhwcDNEb20gY29udGVudFNldERPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwYXRoc0RPTSwgImhhc2giLCAid2ViQ29udGVudFNldCIpOwotICAgIFhwcDNEb20gc291cmNlRE9NID0gZmluZE5hbWVkQ2hpbGQoY29udGVudFNldERPTSwgImxpc3QiLCAidXJsLXBhdGgiKTsKLQotICAgIC8vCi0gICAgLy8gPHVybCBwYXRoPSJbcmVsYXRpdmUtcGF0aC10by1zb3VyY2Utcm9vdF0iIC8+Ci0gICAgLy8KLSAgICBYcHAzRG9tIHRhcmdldERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gc291cmNlUm9vdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBGaWxlIHNvdXJjZVJvb3QgPSBuZXcgRmlsZSgoU3RyaW5nKSBpLm5leHQoKSk7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVSb290ID0gZ2V0UmVsYXRpdmVEaXIocHJvamVjdERpciwgc291cmNlUm9vdCk7Ci0gICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCByZWxhdGl2ZVJvb3QpOwotICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKHVybERPTSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogdXNlIGEgYmV0dGVyIG1lcmdlIGFsZ29yaXRobQotICAgIHJlbW92ZUNoaWxkcmVuKHNvdXJjZURPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlRE9NLCB0YXJnZXRET00sIEJvb2xlYW4uRkFMU0UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VXZWJhcHBJbmZvKFN0cmluZyBwcm9qZWN0TmFtZSwgWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvanByOnByb2plY3QKLSAgICAvLyAgIC9oYXNoW0BuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiXQotICAgIC8vICAgICAvdmFsdWVbQG49ImoyZWVXZWJBcHBOYW1lIiB2PSJtYXZlbi1nZW5lcmF0ZWQtd2ViYXBwIl0KLSAgICAvLyAgICAgL3ZhbHVlW0BuPSJqMmVlV2ViQ29udGV4dFJvb3QiIHY9Im1hdmVuLWdlbmVyYXRlZC1jb250ZXh0LXJvb3QiXQotICAgIFhwcDNEb20gc2V0dGluZ3NET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLCAib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzIik7Ci0gICAgWHBwM0RvbSB3ZWJhcHBOYW1lRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHNldHRpbmdzRE9NLCAidmFsdWUiLCAiajJlZVdlYkFwcE5hbWUiKTsKLSAgICBYcHAzRG9tIHdlYmFwcENvbnRleHRET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQoc2V0dGluZ3NET00sICJ2YWx1ZSIsICJqMmVlV2ViQ29udGV4dFJvb3QiKTsKLQotICAgIC8vIHVwZGF0ZSB0aGUgd2ViYXBwIG5hbWUKLSAgICB3ZWJhcHBOYW1lRE9NLnNldEF0dHJpYnV0ZSgidiIsIHByb2plY3ROYW1lICsgIi13ZWJhcHAiKTsKLQotICAgIC8vIHVwZGF0ZSB0aGUgd2ViYXBwIGNvbnRleHQgcm9vdAotICAgIHdlYmFwcENvbnRleHRET00uc2V0QXR0cmlidXRlKCJ2IiwgcHJvamVjdE5hbWUgKyAiLWNvbnRleHQtcm9vdCIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VTb3VyY2VQYXRocyhGaWxlIHByb2plY3REaXIsIExpc3Qgc291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCByZXNvdXJjZVJvb3RzLCBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbiJdCi0gICAgLy8gICAgIC9oYXNoW0BuPSJqYXZhQ29udGVudFNldCJdCi0gICAgLy8gICAgICAgL2xpc3RbQG49InVybC1wYXRoIl0KLSAgICBYcHAzRG9tIHBhdGhzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbiIpOwotICAgIFhwcDNEb20gY29udGVudFNldERPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwYXRoc0RPTSwgImhhc2giLCAiamF2YUNvbnRlbnRTZXQiKTsKLSAgICBYcHAzRG9tIHNvdXJjZURPTSA9IGZpbmROYW1lZENoaWxkKGNvbnRlbnRTZXRET00sICJsaXN0IiwgImNvbnN0aXR1ZW50LXNldHMiKTsKLQotICAgIC8vCi0gICAgLy8gPHVybCBwYXRoPSJbcmVsYXRpdmUtcGF0aC10by1zb3VyY2Utcm9vdF0iIC8+Ci0gICAgLy8KLSAgICBYcHAzRG9tIHRhcmdldERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0KLSAgICBDb2xsZWN0aW9ucy5zb3J0KHNvdXJjZVJvb3RzKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEZpbGUgc291cmNlUm9vdCA9IG5ldyBGaWxlKChTdHJpbmcpIGkubmV4dCgpKTsKLSAgICAgIFhwcDNEb20gaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0KLSAgICAgIFhwcDNEb20gbGlzdERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgICBsaXN0RE9NLnNldEF0dHJpYnV0ZSgibiIsICJwYXR0ZXJuLWZpbHRlcnMiKTsKLSAgICAgIGhhc2hET00uYWRkQ2hpbGQobGlzdERPTSk7Ci0KLSAgICAgIFhwcDNEb20gc3RyaW5nRE9NID0gbmV3IFhwcDNEb20oInN0cmluZyIpOwotICAgICAgc3RyaW5nRE9NLnNldEF0dHJpYnV0ZSgidiIsICIrKioiKTsKLSAgICAgIGxpc3RET00uYWRkQ2hpbGQoc3RyaW5nRE9NKTsKLQotICAgICAgbGlzdERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgICBsaXN0RE9NLnNldEF0dHJpYnV0ZSgibiIsICJ1cmwtcGF0aCIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgU3RyaW5nIHJlbGF0aXZlUm9vdCA9IGdldFJlbGF0aXZlRGlyKHByb2plY3REaXIsIHNvdXJjZVJvb3QpOwotICAgICAgWHBwM0RvbSB1cmxET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgcmVsYXRpdmVSb290KTsKLSAgICAgIGxpc3RET00uYWRkQ2hpbGQodXJsRE9NKTsKLQotICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgIH0KLQotICAgIC8vIFRPRE86IGdldCBidWcgZml4ZWQgaW4gMTAuMS4zIGZvciBjb3B5aW5nIHJlc291cmNlcwotICAgIENvbGxlY3Rpb25zLnNvcnQocmVzb3VyY2VSb290cywgbmV3IENvbXBhcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBSZXNvdXJjZSByYSA9IChSZXNvdXJjZSkgYTsKLSAgICAgICAgICAgIFJlc291cmNlIHJiID0gKFJlc291cmNlKSBiOwotICAgICAgICAgICAgcmV0dXJuIHJhLmdldERpcmVjdG9yeSgpLmNvbXBhcmVUbyhyYi5nZXREaXJlY3RvcnkoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0pOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpLm5leHQoKTsKLSAgICAgIEZpbGUgcmVzb3VyY2VSb290ID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0RGlyZWN0b3J5KCkpOwotICAgICAgU3RyaW5nIHJlbGF0aXZlUm9vdCA9IGdldFJlbGF0aXZlRGlyKHByb2plY3REaXIsIHJlc291cmNlUm9vdCk7Ci0KLSAgICAgIFhwcDNEb20gaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0KLSAgICAgIFhwcDNEb20gbGlzdERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgICBsaXN0RE9NLnNldEF0dHJpYnV0ZSgibiIsICJwYXR0ZXJuLWZpbHRlcnMiKTsKLSAgICAgIGhhc2hET00uYWRkQ2hpbGQobGlzdERPTSk7Ci0KLSAgICAgIFhwcDNEb20gc3RyaW5nRE9NID0gbnVsbDsKLSAgICAgIC8vIFRPRE86IFRoaXMgaXMgYSBIYWNrIGZvciBleGNsdWRpbmcgdGhlIGdvbGRlbiBmaWxlcywKLSAgICAgIC8vIHdoaWNoIGFyZSBub3QgcmVhbGx5IHhtbCBmaWxlcy4gIFdlIG5lZWQgYSB3YXksIGluCi0gICAgICAvLyB0aGUgcG9tIGZpbGUgdG8gc3BlY2lmeSBleGNsdWRlcy4KLSAgICAgIGlmIChyZWxhdGl2ZVJvb3Quc3RhcnRzV2l0aCgic3JjL3Rlc3QvcmVzb3VyY2VzIikpCi0gICAgICB7Ci0gICAgICAgIHN0cmluZ0RPTSA9IG5ldyBYcHAzRG9tKCJzdHJpbmciKTsKLSAgICAgICAgc3RyaW5nRE9NLnNldEF0dHJpYnV0ZSgidiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1vcmFjbGUvYWRmaW50ZXJuYWwvdmlldy9mYWNlcy9yZW5kZXJraXQvZ29sZGVuLyIpOwotICAgICAgICBsaXN0RE9NLmFkZENoaWxkKHN0cmluZ0RPTSk7Ci0gICAgICB9Ci0KLSAgICAgIHN0cmluZ0RPTSA9IG5ldyBYcHAzRG9tKCJzdHJpbmciKTsKLSAgICAgIHN0cmluZ0RPTS5zZXRBdHRyaWJ1dGUoInYiLCAiKyoqIik7Ci0gICAgICBsaXN0RE9NLmFkZENoaWxkKHN0cmluZ0RPTSk7Ci0KLSAgICAgIGxpc3RET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotICAgICAgbGlzdERPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidXJsLXBhdGgiKTsKLSAgICAgIGhhc2hET00uYWRkQ2hpbGQobGlzdERPTSk7Ci0KLSAgICAgIFhwcDNEb20gdXJsRE9NID0gbmV3IFhwcDNEb20oInVybCIpOwotICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIHJlbGF0aXZlUm9vdCk7Ci0gICAgICBsaXN0RE9NLmFkZENoaWxkKHVybERPTSk7Ci0KLSAgICAgIHRhcmdldERPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRE9NKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBwYXNzIEJvb2xlYW4uRkFMU0UgdG8gYWxsb3cKLSAgICAvLyBtdWx0aXBsZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICBYcHAzRG9tLm1lcmdlWHBwM0RvbShzb3VyY2VET00sIHRhcmdldERPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVJlc291cmNlUGF0aHMoRmlsZSBwcm9qZWN0RGlyLCBMaXN0IHJlc291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyJdCi0gICAgLy8gICAgIC9oYXNoW0BuPSJyZXNvdXJjZXNDb250ZW50U2V0Il0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0idXJsLXBhdGgiXQotCi0gICAgWHBwM0RvbSBwYXRoc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuaWRlLm1vZGVsLlJlc291cmNlUGF0aHMiKTsKLSAgICBYcHAzRG9tIGNvbnRlbnRTZXRET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocGF0aHNET00sICJoYXNoIiwgInJlc291cmNlc0NvbnRlbnRTZXQiKTsKLSAgICBYcHAzRG9tIHNvdXJjZURPTSA9IGZpbmROYW1lZENoaWxkKGNvbnRlbnRTZXRET00sICJsaXN0IiwgInVybC1wYXRoIik7Ci0KLSAgICAvLwotICAgIC8vIDx1cmwgcGF0aD0iW3JlbGF0aXZlLXBhdGgtdG8tc291cmNlLXJvb3RdIiAvPgotICAgIC8vCi0gICAgWHBwM0RvbSB0YXJnZXRET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlUm9vdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICBGaWxlIHJlc291cmNlUm9vdCA9IG5ldyBGaWxlKHJlc291cmNlLmdldERpcmVjdG9yeSgpKTsKLSAgICAgIFN0cmluZyByZWxhdGl2ZVJvb3QgPSBnZXRSZWxhdGl2ZURpcihwcm9qZWN0RGlyLCByZXNvdXJjZVJvb3QpOwotICAgICAgWHBwM0RvbSB1cmxET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgcmVsYXRpdmVSb290KTsKLSAgICAgIHRhcmdldERPTS5hZGRDaGlsZCh1cmxET00pOwotICAgIH0KLQotICAgIC8vIFRPRE86IHVzZSBhIGJldHRlciBtZXJnZSBhbGdvcml0aG0KLSAgICByZW1vdmVDaGlsZHJlbihzb3VyY2VET00pOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIHBhc3MgQm9vbGVhbi5GQUxTRSB0byBhbGxvdwotICAgIC8vIG11bHRpcGxlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHNvdXJjZURPTSwgdGFyZ2V0RE9NLCBCb29sZWFuLkZBTFNFKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlRGVwZW5kZW5jaWVzKEZpbGUgcHJvamVjdERpciwgTGlzdCBkZXBlbmRlbmNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmlkZS5tb2RlbC5EZXBlbmRlbmN5Q29uZmlndXJhdGlvbiJdCi0gICAgLy8gICAgIC9saXN0W0BuPSJkZXBlbmRlbmN5TGlzdCJdCi0gICAgWHBwM0RvbSBjb25maWdET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLCAib3JhY2xlLmlkZS5tb2RlbC5EZXBlbmRlbmN5Q29uZmlndXJhdGlvbiIpOwotICAgIFhwcDNEb20gc291cmNlRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKGNvbmZpZ0RPTSwgImxpc3QiLCAiZGVwZW5kZW5jeUxpc3QiKTsKLQotICAgIFhwcDNEb20gdGFyZ2V0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSAoRGVwZW5kZW5jeSkgaS5uZXh0KCk7Ci0gICAgICBNYXZlblByb2plY3QgZGVwZW5kZW50UHJvamVjdCA9Ci0gICAgICAgIGZpbmREZXBlbmRlbnRQcm9qZWN0KGRlcGVuZGVuY3kuZ2V0TWFuYWdlbWVudEtleSgpKTsKLSAgICAgIGlmIChkZXBlbmRlbnRQcm9qZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEZpbGUgZGVwZW5kZW50UHJvamVjdEZpbGUgPSBnZXRKUHJvamVjdEZpbGUoZGVwZW5kZW50UHJvamVjdCk7Ci0gICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPQotICAgICAgICAgIGdldFJlbGF0aXZlRmlsZShwcm9qZWN0RGlyLCBkZXBlbmRlbnRQcm9qZWN0RmlsZSk7Ci0KLSAgICAgICAgWHBwM0RvbSBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLSAgICAgICAgWHBwM0RvbSB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiY2xhc3MiKTsKLSAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmFjbGUuamRldmVsb3Blci5saWJyYXJ5LlByb2plY3RMaWJyYXJ5Iik7Ci0gICAgICAgIFhwcDNEb20gc3JjT3duVmFsRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHNyY093blZhbERPTS5zZXRBdHRyaWJ1dGUoIm4iLCAic291cmNlT3duZXJVUkwiKTsKLSAgICAgICAgWHBwM0RvbSB1cmxET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoIm4iLCAic291cmNlVVJMIik7Ci0gICAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCByZWxhdGl2ZVBhdGgpOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgICAgaGFzaERPTS5hZGRDaGlsZChzcmNPd25WYWxET00pOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHVybERPTSk7Ci0gICAgICAgIHRhcmdldERPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRE9NKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBwYXNzIEJvb2xlYW4uRkFMU0UgdG8gYWxsb3cKLSAgICAvLyBtdWx0aXBsZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICBYcHAzRG9tLm1lcmdlWHBwM0RvbShzb3VyY2VET00sIHRhcmdldERPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZUxpYnJhcmllcyhGaWxlIHByb2plY3REaXIsIExpc3QgYXJ0aWZhY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RMaWJyYXJpZXMiXQotICAgIC8vICAgICAvaGFzaFtAbj0iaW50ZXJuYWxEZWZpbml0aW9ucyJdCi0gICAgLy8gICAgICAgL2xpc3RbQG49ImxpYnJhcnlEZWZpbml0aW9ucyJdCi0gICAgWHBwM0RvbSBwcm9qZWN0TGlic0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0TGlicmFyaWVzIik7Ci0gICAgWHBwM0RvbSBpbnRlcm5hbERlZnNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdExpYnNET00sICJoYXNoIiwgImludGVybmFsRGVmaW5pdGlvbnMiKTsKLSAgICBYcHAzRG9tIHNvdXJjZURlZnNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQoaW50ZXJuYWxEZWZzRE9NLCAibGlzdCIsICJsaWJyYXJ5RGVmaW5pdGlvbnMiKTsKLQotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RMaWJyYXJpZXMiXQotICAgIC8vICAgICAvbGlzdFtAbj0ibGlicmFyeVJlZmVyZW5jZXMiXQotICAgIFhwcDNEb20gc291cmNlUmVmc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0TGlic0RPTSwgImxpc3QiLCAibGlicmFyeVJlZmVyZW5jZXMiKTsKLQotICAgIFhwcDNEb20gdGFyZ2V0RGVmc0RPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgWHBwM0RvbSB0YXJnZXRSZWZzRE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLQotICAgIC8vCi0gICAgLy8gbGlicmFyeURlZmluaXRpb25zCi0gICAgLy8KLSAgICAvLyA8aGFzaD4KLSAgICAvLyAgIDxsaXN0IG49ImNsYXNzUGF0aCI+Ci0gICAgLy8gICAgIDx1cmwgcGF0aD0iW3BhdGgtdG8tYXJ0aWZhY3RdIiBqYXItZW50cnk9IiIgLz4KLSAgICAvLyAgIDwvbGlzdD4KLSAgICAvLyAgIDx2YWx1ZSBuPSJkZXBsb3llZEJ5RGVmYXVsdCIgdj0idHJ1ZSIvPgotICAgIC8vICAgPHZhbHVlIG49ImRlc2NyaXB0aW9uIiB2PSJbYXJ0aWZhY3QuaWRdIi8+Ci0gICAgLy8gICA8dmFsdWUgbj0iaWQiIHY9IlthcnRpZmFjdC5pZF0iLz4KLSAgICAvLyA8L2hhc2g+Ci0gICAgLy8KLQotICAgIC8vIHNvcnQgdGhlIGFydGlmYWN0cwotICAgIENvbGxlY3Rpb25zLnNvcnQoYXJ0aWZhY3RzLCBuZXcgQ29tcGFyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGEgPSAoQXJ0aWZhY3QpIGE7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRiID0gKEFydGlmYWN0KSBiOwotICAgICAgICAgICAgcmV0dXJuIGFydGEuZ2V0SWQoKS5jb21wYXJlVG8oYXJ0Yi5nZXRJZCgpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICBMaXN0IGxpYnJhcnlSZWZzID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmICghaXNEZXBlbmRlbnRQcm9qZWN0KGFydGlmYWN0LmdldERlcGVuZGVuY3lDb25mbGljdElkKCkpKQotICAgICAgewotICAgICAgICBTdHJpbmcgaWQgPSBhcnRpZmFjdC5nZXRJZCgpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlRmlsZShwcm9qZWN0RGlyLCBhcnRpZmFjdC5nZXRGaWxlKCkpOwotCi0gICAgICAgIC8vIGxpYnJhcnlEZWZpbml0aW9ucyBlbnRyeQotICAgICAgICBYcHAzRG9tIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgICAgICBYcHAzRG9tIGxpc3RET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotICAgICAgICBsaXN0RE9NLnNldEF0dHJpYnV0ZSgibiIsICJjbGFzc1BhdGgiKTsKLQotICAgICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIHBhdGgpOwotICAgICAgICB1cmxET00uc2V0QXR0cmlidXRlKCJqYXItZW50cnkiLCAiIik7Ci0gICAgICAgIGxpc3RET00uYWRkQ2hpbGQodXJsRE9NKTsKLSAgICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgICBYcHAzRG9tIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJkZXBsb3llZEJ5RGVmYXVsdCIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAidHJ1ZSIpOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiZGVzY3JpcHRpb24iKTsKLSAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgaWQpOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiaWQiKTsKLSAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgaWQpOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgICAgdGFyZ2V0RGVmc0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLQotICAgICAgICBsaWJyYXJ5UmVmcy5hZGQoaWQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoaXMgYm9vbGVhbiBpcyBzZXQgYnkgc3BlY2lmeWluZyB0aGUgamRldi5wbHVnaW4uYWRkLmxpYnJhcmllcwotICAgIC8vIHByb3BlcnR5IGF0IHRoZSB0b3Agb2YgYSBwcm9qZWN0J3MgcG9tIGZpbGUuICBUaGVyZSBhcmUgcHJvamVjdHMKLSAgICAvLyB0aGF0IGRvbid0IG5lZWQgdGhlc2UgbGlicmFyaWVzIGluIHRoZWlyIC5qcHIgZmlsZXMgdG8gY29tcGlsZSBhbmQgdGhpcwotICAgIC8vIHByb3BlcnR5IGFsbG93cyB0aGVtIHRvIGJlIGV4Y2x1ZGVkLgotICAgIC8vCi0gICAgLy8gSU1QT1JUQU5UIE5PVEU6IGlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IGluIGEgcHJvamVjdCwKLSAgICAvLyB0aGVuIGxpYnJhcmllcyB3aWxsIE5PVCBiZSBhZGRlZCwgZXZlbiB0aG91Z2ggdGhleQotICAgIC8vIG1heSBiZSBzcGVjaWZpZWQgdW5kZXIgdGhlIG1hdmVuLWpkZXYtcGx1Z2luLgotICAgIGlmIChfYWRkTGlicmFyaWVzKQotICAgIHsKLSAgICAgIC8vIEFkZCBsaWJyYXJpZXMuICBUaGUgZGVmYXVsdCBsaWJyYXJpZXMgY2FuIGJlCi0gICAgICAvLyBvdmVycmlkZGVuIGluIHRoZSB0cnVuay90b3BsZXZlbCBwb20gZmlsZS4KLSAgICAgIGlmIChfcmVsZWFzZU1ham9yID49IDExKQotICAgICAgewotICAgICAgICAvLyBBZGQgdGhlIGRlZmF1bHQgbGlicmFyaWVzCi0gICAgICAgIGxpYnJhcnlSZWZzLmFkZCgwLCJKU0YgMS4yIik7Ci0gICAgICAgIGxpYnJhcnlSZWZzLmFkZCgwLCJKU1AgUnVudGltZSIpOwotICAgICAgfQotCi0gICAgICAvLyBBZGQgdGhlIGxpYnJhcmllcwotICAgICAgaWYgKGxpYnJhcmllcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpYnJhcmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIC8vIERlZmF1bHQgbGlicmFyaWVzIGZvciByZWxlYXNlIDExIHdlcmUgYWxyZWFkeQotICAgICAgICAgIC8vIGFkZGVkIGFib3ZlLgotICAgICAgICAgIGlmICggICAoX3JlbGVhc2VNYWpvciA+PSAxMSkKLSAgICAgICAgICAgICAgJiYgKCAgICgiSlNGIDEuMiIuZXF1YWxzSWdub3JlQ2FzZShsaWJyYXJpZXNbaV0pKQotICAgICAgICAgICAgICAgICAgfHwgKCJKU1AgUnVudGltZSIuZXF1YWxzSWdub3JlQ2FzZShsaWJyYXJpZXNbaV0pKQotICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBBZGQgdGhlIGxpYnJhcnkKLSAgICAgICAgICBsaWJyYXJ5UmVmcy5hZGQoMCwgbGlicmFyaWVzW2ldKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8gbGlicmFyeVJlZmVyZW5jZXMKLSAgICAvLwotICAgIC8vIDxoYXNoPgotICAgIC8vICAgPHZhbHVlIG49ImlkIiB2PSJbYXJ0aWZhY3QuaWRdIi8+Ci0gICAgLy8gICA8dmFsdWUgbj0iaXNKREsiIHY9ImZhbHNlIi8+Ci0gICAgLy8gPC9oYXNoPgotICAgIC8vCi0gICAgQ29sbGVjdGlvbnMuc29ydChsaWJyYXJ5UmVmcyk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaWJyYXJ5UmVmcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpIGkubmV4dCgpOwotCi0gICAgICAvLyBsaWJyYXJ5UmVmZXJlbmNlcyBlbnRyeQotICAgICAgWHBwM0RvbSBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLSAgICAgIFhwcDNEb20gdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJpZCIpOwotICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgaWQpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiaXNKREsiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJmYWxzZSIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0gICAgICB0YXJnZXRSZWZzRE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgIH0KLQotICAgIC8vIEZpcnN0LCBhZGQgSlNQIFJ1bnRpbWUgZGVwZW5kZW5jeSBpZiBzcmMvbWFpbi93ZWJhcHAgZXhpc3RzCi0gICAgLy8gVE9ETzogdXNlIGEgYmV0dGVyIG1lcmdlIGFsZ29yaXRobQotICAgIHJlbW92ZUNoaWxkcmVuKHNvdXJjZURlZnNET00pOwotICAgIHJlbW92ZUNoaWxkcmVuKHNvdXJjZVJlZnNET00pOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIHBhc3MgQm9vbGVhbi5GQUxTRSB0byBhbGxvdwotICAgIC8vIG11bHRpcGxlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHNvdXJjZURlZnNET00sIHRhcmdldERlZnNET00sIEJvb2xlYW4uRkFMU0UpOwotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHNvdXJjZVJlZnNET00sIHRhcmdldFJlZnNET00sIEJvb2xlYW4uRkFMU0UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VMb2NhbFRhZ0xpYnJhcmllcyhYcHAzRG9tIHRhcmdldExpYnNET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIFRsZENvbnRlbnRIYW5kbGVyIHRsZEhhbmRsZXIgPSBuZXcgVGxkQ29udGVudEhhbmRsZXIoKTsKLSAgICBTdHJpbmcgcGF0aCA9IG51bGw7Ci0KLSAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSAudGxkIGZpbGVzIGluIHRoZSBXRUItSU5GIGRpcgotICAgIC8vIFBhcnNlIGVhY2ggYW5kIGdldCB0aGUgdmFsdWVzIG5lZWRlZCBmb3IgdGhlIFRhZ0xpYnJhcmllcwotICAgIC8vIGhhc2ggaW4gdGhlIC5qcHIgZmlsZS4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIHdlYkluZkRpciA9Ci0gICAgICAgIG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCAic3JjL21haW4vd2ViYXBwL1dFQi1JTkYiKTsKLSAgICAgIGlmICh3ZWJJbmZEaXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBGaWxlW10gZmlsZXMgPSB3ZWJJbmZEaXIubGlzdEZpbGVzKCk7Ci0gICAgICBpZiAoZmlsZXMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBYcHAzRG9tIGhhc2hET00gPSBudWxsOwotICAgICAgWHBwM0RvbSB2YWx1ZURPTSA9IG51bGw7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBwYXRoID0gZmlsZXNbaV0uZ2V0UGF0aCgpOwotICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLnRsZCIpKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgICAgICAgLy8gd2UgaGF2ZSBhIHRhZyBsaWJyYXJ5LiAgUGFyc2UgaXQgYW5kCi0gICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZXMgbmVlZGVkIGZvciB0aGUgLmpwciBmaWxlCi0KLSAgICAgICAgICAvLyBQYXJzZQotICAgICAgICAgIHRsZEhhbmRsZXIucGFyc2VUbGQoZmlsZXNbaV0pOwotICAgICAgICAgIC8vIGNhbGwgZ2V0dG9ycyB0byBnZXQgdGhlIHZhbHVlcwotICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImpzcFZlcnNpb24iKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0bGRIYW5kbGVyLmdldEpzcFZlcnNpb24oKSk7Ci0gICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJuYW1lIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdGxkSGFuZGxlci5nZXROYW1lKCkpOwotICAgICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAicHJlZml4Iik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdGxkSGFuZGxlci5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ0bGRVUkwiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLAotICAgICAgICAgICAgIldFQi1JTkYvIiArIHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZigiV0VCLUlORiIpICsgIDgpKTsKLSAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIlVSSSIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHRsZEhhbmRsZXIuZ2V0VVJJKCkpOwotICAgICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidmVyc2lvbiIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHRsZEhhbmRsZXIuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgIC8vIEFkZCBlYWNoIGZpbGUncyBoYXNoIHRvIHRoZSB0YWctbGlicmFyaWVzICJsaXN0IgotICAgICAgICAgIHRhcmdldExpYnNET00uYWRkQ2hpbGQoaGFzaERPTSk7Ci0gICAgICAgIH0gLy8gZW5kaWYKLSAgICAgIH0gLy8gZW5kZm9yCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2F4ZXgpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiU0FYIFBhcnNlIEV4Y2VwdGlvbiBwYXJzaW5nICIgKyBwYXRoICsgIjogIiArCi0gICAgICAgICAgICAgICAgICAgIHNheGV4LmdldE1lc3NhZ2UoKSwgc2F4ZXgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIlVuYWJsZSB0byBvcGVuIGFuIElucHV0U3RyZWFtIHRvICIgKyBwYXRoLCBpb2UpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiVW5hYmxlIHRvIGNyZWF0ZSBTQVggcGFyc2VyIGZvciAiICsgcGF0aCwgcGNlKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlVGFnTGlicmFyaWVzKFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gVGhpcyBib29sZWFuIGlzIHNldCBieSBzcGVjaWZ5aW5nIHRoZSBqZGV2LnBsdWdpbi5hZGQudGFnbGlicwotICAgIC8vIHByb3BlcnR5IGF0IHRoZSB0b3Agb2YgYSBwcm9qZWN0J3MgcG9tIGZpbGUuICBUaGVyZSBhcmUgcHJvamVjdHMKLSAgICAvLyB0aGF0IGRvbid0IG5lZWQgdGFnbGlicyBpbiB0aGVpciAuanByIGZpbGVzIHRvIGNvbXBpbGUgYW5kIHRoaXMKLSAgICAvLyBhbGxvd3MgdGhlbSB0byBiZSBleGNsdWRlZC4KLSAgICBpZiAoIV9hZGRUYWdMaWJzKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyAvanByOnByb2plY3QKLSAgICAvLyAgIC9oYXNoW0BuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyJdCi0gICAgLy8gICAgICAgL2xpc3RbQG49InRhZy1saWJhcmllcyJdCi0gICAgWHBwM0RvbSBwcm9qZWN0VGFnc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyIpOwotICAgIFhwcDNEb20gdGFnTGlic0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0VGFnc0RPTSwgImxpc3QiLCAidGFnLWxpYnJhcmllcyIpOwotCi0gICAgWHBwM0RvbSB0YXJnZXRMaWJzRE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLQotICAgIC8vCi0gICAgLy8gdGFnTGlicmFyeURlZmluaXRpb25zCi0gICAgLy8KLSAgICAvLzxoYXNoPgotICAgIC8vICA8aGFzaCBuPSJiYXNlTGlicmFyeSI+Ci0gICAgLy8gICAgPHZhbHVlIG49Im5hbWUiIHY9IkpTRiBIVE1MIj48L3ZhbHVlPgotICAgIC8vICAgIDx2YWx1ZSBuPSJ2ZXJzaW9uIiB2PSIxLjIiPjwvdmFsdWU+Ci0gICAgLy8gIDwvaGFzaD4KLSAgICAvLyAgPHZhbHVlIG49ImpzcFZlcnNpb24iIHY9IjIuMSI+PC92YWx1ZT4KLSAgICAvLyAgPHZhbHVlIG49Im5hbWUiIHY9IkpTRiBIVE1MIj48L3ZhbHVlPgotICAgIC8vCi0gICAgLy8gIDx2YWx1ZSBuPSJ0bGRVUkwiIHY9IkBvcmFjbGUuaG9tZUBsaWIvamF2YS9zaGFyZWQvb3JhY2xlLmpzZi8xLjIvanNmLXJpLmphciEvTUVUQS1JTkYvaHRtbF9iYXNpYy50bGQiPjwvdmFsdWU+Ci0gICAgLy8gIDx2YWx1ZSBuPSJVUkkiIHY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiPjwvdmFsdWU+Ci0gICAgLy8gIDx2YWx1ZSBuPSJ2ZXJzaW9uIiB2PSIxLjIiPjwvdmFsdWU+Ci0gICAgLy88L2hhc2g+Ci0gICAgLy8KLQotICAgIC8vIFBhcmVudCAiaGFzaCIKLSAgICBYcHAzRG9tIGhhc2hET00gPSBudWxsOwotCi0gICAgLy8gPHZhbHVlLi4uCi0gICAgWHBwM0RvbSB2YWx1ZURPTSA9IG51bGw7Ci0KLSAgICBpZiAoZGlzdHJpYnV0ZWRUYWdMaWJyYXJpZXMgIT0gbnVsbCAmJgotICAgICAgICBkaXN0cmlidXRlZFRhZ0xpYnJhcmllcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIC8vIFByb2Nlc3MgZWFjaCBkaXN0cmlidXRlZCBUYWcgTGlicmFyeQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXN0cmlidXRlZFRhZ0xpYnJhcmllcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydGllcyBkaXNUYWdMaWIgPSBkaXN0cmlidXRlZFRhZ0xpYnJhcmllc1tpXTsKLSAgICAgICAgU3RyaW5nIG5hbWVOYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG5hbWVWYWx1ZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uVmFsdWUgPSBudWxsOwotCi0gICAgICAgIC8vIENyZWF0ZSBwYXJlbnQgaGFzaCBmb3IgZWFjaCB0YWdsaWIKLSAgICAgICAgaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0KLSAgICAgICAgLy8gYmFzZUxpYnJhcnkgImhhc2giIGZvciBlYWNoIHRhZ2xpYgotICAgICAgICBYcHAzRG9tIGhhc2hCYXNlRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLSAgICAgICAgaGFzaEJhc2VET00uc2V0QXR0cmlidXRlKCJuIiwgImJhc2VMaWJyYXJ5Iik7Ci0gICAgICAgIC8vIEFkZCBiYXNlTGlicmFyeSBoYXNoIHRvIHBhcmVudCBoYXNoCi0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQoaGFzaEJhc2VET00pOwotCi0gICAgICAgIC8vIFByb2Nlc3MgZWFjaCBwcm9wZXJ0eSBvZiB0aGUgdGFnbGliCi0gICAgICAgIGZvciAoRW51bWVyYXRpb24ga2V5cyA9IGRpc1RhZ0xpYi5wcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgICAgICAga2V5cy5oYXNNb3JlRWxlbWVudHMoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHRoZSBuYW1lIHZhbHVlIHBhaXIKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBkaXNUYWdMaWIuZ2V0KG5hbWUpOwotCi0gICAgICAgICAgLy8gUHV0IHRoZSBuYW1lIGFuZCB2ZXJzaW9uIHZhbHVlcwotICAgICAgICAgIC8vIGluc2lkZSB0aGUgYmFzZUxpYnJhcnkgaGFzaC4KLSAgICAgICAgICAvLyBUaGlzIG9ubHkgaGFwcGVucyBvbmNlIHBlciB0YWdsaWIKLSAgICAgICAgICBpZiAoIm5hbWUiLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBuYW1lVmFsdWUgPSB2YWx1ZTsKLQotICAgICAgICAgICAgLy8gbj0ibmFtZSwgdj08bmFtZSBvZiB0YWdsaWI+IGluIGJhc2VMaWJyYXJ5Ci0gICAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgbmFtZSk7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB2YWx1ZSk7Ci0gICAgICAgICAgICBoYXNoQmFzZURPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICAgIC8vIER1cGxpY2F0ZSB0aGUgIm5hbWUiICA8dmFsdWUuLi4KLSAgICAgICAgICAgIC8vIG91dHNpZGUgb2YgdGhlIGJhc2VMaWJyYXJ5Ci0gICAgICAgICAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gcGFyZW50IGhhc2gKLSAgICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCBuYW1lTmFtZSk7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCBuYW1lVmFsdWUpOwotICAgICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCJ2ZXJzaW9uIi5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmVyc2lvbk5hbWUgPSBuYW1lOwotICAgICAgICAgICAgdmVyc2lvblZhbHVlID0gdmFsdWU7Ci0KLSAgICAgICAgICAgIC8vIG49InZlcnNpb24iIHY9PHRhZ2xpYiB2ZXJzaW9uPiBpbiBiYXNlTGlicmFyeQotICAgICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsIG5hbWUpOwotICAgICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdmFsdWUpOwotICAgICAgICAgICAgaGFzaEJhc2VET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgICAgICAvLyBEdXBsaWNhdGUgdGhlICJ2ZXJzaW9uIiA8dmFsdWUuLi4KLSAgICAgICAgICAgIC8vIG91dHNpZGUgb2YgdGhlIGJhc2VMaWJyYXJ5Ci0gICAgICAgICAgICAvLyBuPSJ2ZXJzaW9uIiB2PTx0YWdsaWIgdmVyc2lvbj4gaW4gcGFyZW50IGhhc2gKLSAgICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCB2ZXJzaW9uTmFtZSk7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB2ZXJzaW9uVmFsdWUpOwotICAgICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoInRsZCIuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBEaWQgbm90IHdhbnQgdG8gaGF2ZSBhIFVSTCBpbiB0aGUgcG9tIGZpbGUuCi0gICAgICAgICAgICAgIC8vIEkganVzdCB3YW50ZWQgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbmFtZQotICAgICAgICAgICAgICAvLyBvZiB0aGUgdGxkIGZpbGUuICBTbyB3ZSBmaXggaXQgZm9yIEpEZXYKLSAgICAgICAgICAgICAgLy8gaGVyZS4KLSAgICAgICAgICAgICAgbmFtZSArPSAiVVJMIjsKLSAgICAgICAgICAgICAgdmFsdWUgPSB0YWdMaWJEaXJlY3RvcnkgKyAiLyIgKyB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCBuYW1lKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHZhbHVlKTsKLSAgICAgICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotICAgICAgICAgIH0KLSAgICAgICAgfSAvL2VuZGZvciBwcm9jZXNzaW5nIGVhY2ggcHJvcGVydHkKLQotICAgICAgICAvLyBXZSBhcmUgZG9uZSB3aXRoIHRoaXMgZGlzVGFnTGliCi0gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgdGFyZ2V0TGlic0RPTQotICAgICAgICBpZiAoaGFzaERPTSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0TGlic0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICAgICAgfQotICAgICAgfSAvLyBlbmRmb3IgcHJvY2Vzc2luZyBlYWNoIGRpc3RyaWJ1dGVkIHRhZyBsaWIKLSAgICB9IC8vZW5kaWYKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVXNlIERlZmF1bHQgdGFnIGxpYnJhcnkgY29uZmlndXJhdGlvbi4gIFNlZSBjb21tZW50IGJlZm9yZQotICAgICAgLy8gcmVwbGFjZVRhZ0xpYnJhcmllcy4KLSAgICAgIHJlcGxhY2VEZWZhdWx0VGFnTGlicmFyaWVzKHByb2plY3RET00sIHRhcmdldExpYnNET00pOwotICAgIH0KLQotICAgIHJlcGxhY2VMb2NhbFRhZ0xpYnJhcmllcyh0YXJnZXRMaWJzRE9NKTsKLQotICAgIC8vIEZpcnN0LCBhZGQgSlNQIFJ1bnRpbWUgZGVwZW5kZW5jeSBpZiBzcmMvbWFpbi93ZWJhcHAgZXhpc3RzCi0gICAgLy8gVE9ETzogdXNlIGEgYmV0dGVyIG1lcmdlIGFsZ29yaXRobQotICAgIHJlbW92ZUNoaWxkcmVuKHRhZ0xpYnNET00pOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIHBhc3MgQm9vbGVhbi5GQUxTRSB0byBhbGxvdwotICAgIC8vIG11bHRpcGxlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHRhZ0xpYnNET00sIHRhcmdldExpYnNET00sIEJvb2xlYW4uRkFMU0UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VEZWZhdWx0VGFnTGlicmFyaWVzKFhwcDNEb20gcHJvamVjdERPTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhwcDNEb20gdGFyZ2V0TGlic0RPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQmVnaW4gSlNGIEhUTUwgVGFnIGxpYgotICAgIFhwcDNEb20gaGFzaERPTSAgICAgPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgIFhwcDNEb20gaGFzaEJhc2VET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgIFhwcDNEb20gdmFsdWVET00gICAgPSBudWxsOwotCi0gICAgaGFzaEJhc2VET00uc2V0QXR0cmlidXRlKCJuIiwgImJhc2VMaWJyYXJ5Iik7Ci0KLSAgICAvLyBBZGQgYmFzZUxpYnJhcnkgaGFzaCB0byBwYXJlbnQgaGFzaAotICAgIGhhc2hET00uYWRkQ2hpbGQoaGFzaEJhc2VET00pOwotCi0gICAgLy8gQ3JlYXRlIHBhcmVudCBoYXNoIGZvciBlYWNoIHRhZ2xpYgotICAgIC8vICAgICAgICBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgIC8vIGJhc2VMaWJyYXJ5ICJoYXNoIiBmb3IgZWFjaCB0YWdsaWIKLSAgICAvLyBYcHAzRG9tIGhhc2hCYXNlRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLSAgICAvLyAgICAgICAgaGFzaEJhc2VET00uc2V0QXR0cmlidXRlKCJuIiwgImJhc2VMaWJyYXJ5Iik7Ci0KLSAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gYmFzZUxpYnJhcnkKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJuYW1lIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIkpTRiBIVE1MIik7Ci0gICAgaGFzaEJhc2VET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gRHVwbGljYXRlIHRoZSAibmFtZSIgIDx2YWx1ZS4uLgotICAgIC8vIG91dHNpZGUgb2YgdGhlIGJhc2VMaWJyYXJ5Ci0gICAgLy8gbj0ibmFtZSwgdj08bmFtZSBvZiB0YWdsaWI+IGluIHBhcmVudCBoYXNoCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAibmFtZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJKU0YgSFRNTCIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gbj0idmVyc2lvbiIgdj08dGFnbGliIHZlcnNpb24+IGluIGJhc2VMaWJyYXJ5Ci0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidmVyc2lvbiIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICIxLjIiKTsKLSAgICBoYXNoQmFzZURPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAvLyBEdXBsaWNhdGUgdGhlICJ2ZXJzaW9uIiA8dmFsdWUuLi4KLSAgICAvLyBvdXRzaWRlIG9mIHRoZSBiYXNlTGlicmFyeQotICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBwYXJlbnQgaGFzaAotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgInZlcnNpb24iKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiMS4yIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJqc3BWZXJzaW9uIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIjIuMSIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidGxkVVJMIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdGFnTGliRGlyZWN0b3J5ICsgIi9odG1sX2Jhc2ljLnRsZCIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiVVJJIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgImh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhpcyBkaXNUYWdMaWIKLSAgICAvLyBBZGQgaXQgdG8gdGhlIHRhcmdldExpYnNET00KLSAgICBpZiAoaGFzaERPTSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRhcmdldExpYnNET00uYWRkQ2hpbGQoaGFzaERPTSk7Ci0gICAgfQotCi0gICAgLy8gQmVnaW4gSlNGIENvcmUgVGFnbGliCi0gICAgaGFzaERPTSAgICAgPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgIGhhc2hCYXNlRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgIGhhc2hCYXNlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJiYXNlTGlicmFyeSIpOwotCi0gICAgLy8gQWRkIGJhc2VMaWJyYXJ5IGhhc2ggdG8gcGFyZW50IGhhc2gKLSAgICBoYXNoRE9NLmFkZENoaWxkKGhhc2hCYXNlRE9NKTsKLQotICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBiYXNlTGlicmFyeQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIm5hbWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiSlNGIENvcmUiKTsKLSAgICBoYXNoQmFzZURPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAvLyBEdXBsaWNhdGUgdGhlICJuYW1lIiAgPHZhbHVlLi4uCi0gICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gcGFyZW50IGhhc2gKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJuYW1lIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIkpTRiBDb3JlIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAvLyBuPSJ2ZXJzaW9uIiB2PTx0YWdsaWIgdmVyc2lvbj4gaW4gYmFzZUxpYnJhcnkKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ2ZXJzaW9uIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIjEuMiIpOwotICAgIGhhc2hCYXNlRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIER1cGxpY2F0ZSB0aGUgInZlcnNpb24iIDx2YWx1ZS4uLgotICAgIC8vIG91dHNpZGUgb2YgdGhlIGJhc2VMaWJyYXJ5Ci0gICAgLy8gbj0ibmFtZSwgdj08bmFtZSBvZiB0YWdsaWI+IGluIHBhcmVudCBoYXNoCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidmVyc2lvbiIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICIxLjIiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImpzcFZlcnNpb24iKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiMi4xIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ0bGRVUkwiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0YWdMaWJEaXJlY3RvcnkgKyAiL2pzZl9jb3JlLnRsZCIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiVVJJIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgImh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhpcyBkaXNUYWdMaWIKLSAgICAvLyBBZGQgaXQgdG8gdGhlIHRhcmdldExpYnNET00KLSAgICBpZiAoaGFzaERPTSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRhcmdldExpYnNET00uYWRkQ2hpbGQoaGFzaERPTSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VQYXJhbWV0ZXJzKFN0cmluZyBwcm9qZWN0TmFtZSwgWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoKF9yZWxlYXNlTWFqb3IgPj0gMTEpICYmIChwcm9qZWN0TmFtZSAhPSBudWxsKSkKLSAgICB7Ci0gICAgICByZXBsYWNlQ29tcGlsZXIocHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlTWFrZVByb2plY3RBbmRSdW5UYXJnZXQocHJvamVjdERPTSk7Ci0gICAgfQotICB9Ci0gIHByaXZhdGUgdm9pZCByZXBsYWNlQ29tcGlsZXIoWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvanByOnByb2plY3QKLSAgICAvLyA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5jb21waWxlci5PamNDb25maWd1cmF0aW9uIj4KLSAgICAvLyAgIDx2YWx1ZSBuPSJhc3NlcnRpb25zRW5hYmxlZCIgdj0idHJ1ZSIvPgotICAgIC8vICAgPHZhbHVlIG49ImNvbXBpbGVyLm5hbWUiIHY9Ik9qYyIvPgotICAgIC8vICAgPGxpc3Qgbj0iY29weVJlcyI+Ci0gICAgLy8gICAgICA8c3RyaW5nIHY9Ii5qYXZhIi8+Ci0gICAgWHBwM0RvbSBjb25maWdET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLAotICAgICAgICAgICAgICAgICAgICAgIm9yYWNsZS5qZGV2ZWxvcGVyLmNvbXBpbGVyLk9qY0NvbmZpZ3VyYXRpb24iKTsKLSAgICBYcHAzRG9tIGNvbXBpbGVyRE9NID0gZmluZE5hbWVkQ2hpbGQoY29uZmlnRE9NLCAidmFsdWUiLCAiY29tcGlsZXIubmFtZSIpOwotICAgIFN0cmluZyBjb21waWxlclZhbHVlID0gIk9qYyI7Ci0KLSAgICBpZiAoICAgKGNvbXBpbGVyICE9IG51bGwpCi0gICAgICAgICYmICJKYXZhYyIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlcikKLSAgICAgICApCi0gICAgewotICAgICAgY29tcGlsZXJWYWx1ZSA9ICJKYXZhYyI7Ci0gICAgfQotICAgIGNvbXBpbGVyRE9NLnNldEF0dHJpYnV0ZSgidiIsIGNvbXBpbGVyVmFsdWUpOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VNYWtlUHJvamVjdEFuZFJ1blRhcmdldChYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2ZWxvcGVyLnJ1bm5lci5SdW5Db25maWd1cmF0aW9ucyJdCi0gICAgLy8gICAgIC9oYXNoW0BuPSJydW5Db25maWd1cmF0aW9uRGVmaW5pdGlvbnMiXQotICAgIC8vICAgICAgIC9oYXNoW0BuPSJEZWZhdWx0Il0KLSAgICAvLyAgICAgICAgIC92YWx1ZVtAbj0ibWFrZVByb2plY3QiIHY9ImZhbHNlIl0KLSAgICAvLyAgICAgICAgIC91cmxbQG49InRhcmdldFVSTCIgcGF0aD0ic3JjL21haW4vd2ViYXBwL2luZGV4LmpzcHgiXQotICAgIFhwcDNEb20gY29uZmlnRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwKLSAgICAgICAgICAgICAgICAgICAgICJvcmFjbGUuamRldmVsb3Blci5ydW5uZXIuUnVuQ29uZmlndXJhdGlvbnMiKTsKLSAgICBYcHAzRG9tIGRlZnNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQoY29uZmlnRE9NLCAiaGFzaCIsICJydW5Db25maWd1cmF0aW9uRGVmaW5pdGlvbnMiKTsKLSAgICBYcHAzRG9tIGRlZmF1bHRET00gPSBmaW5kTmFtZWRDaGlsZChkZWZzRE9NLCAiaGFzaCIsICJEZWZhdWx0Iik7Ci0gICAgWHBwM0RvbSBtYWtlUHJvamVjdERvbSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChkZWZhdWx0RE9NLCAidmFsdWUiLCAiY29tcGlsZUJlZm9yZVJ1biIpOwotCi0gICAgaWYgKG1ha2VQcm9qZWN0KQotICAgIHsKLSAgICAgIG1ha2VQcm9qZWN0RG9tLnNldEF0dHJpYnV0ZSgidiIsICJ0cnVlIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtYWtlUHJvamVjdERvbS5zZXRBdHRyaWJ1dGUoInYiLCAiZmFsc2UiKTsKLSAgICB9Ci0KLSAgICBpZiAoKHJ1blRhcmdldCAhPSBudWxsKSAmJiAhIiIuZXF1YWxzKHJ1blRhcmdldCkpCi0gICAgewotICAgICAgLy8gQ29udmVydCBmaWxlIHNlcGFyYXRvciBjaGFycyB0byBnZW5lcmljCi0gICAgICBTdHJpbmcgdGFyZ2V0VVJMID0gIiI7Ci0gICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJykKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0VVJMID0gcnVuVGFyZ2V0LnJlcGxhY2UoJ1xcJywgJy8nKTsgLy8gVW5peAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0YXJnZXRVUkwgPSBydW5UYXJnZXQucmVwbGFjZSgnLycsICdcXCcpOyAvLyBXaW5kb3dzCi0gICAgICB9Ci0KLSAgICAgIFhwcDNEb20gdGFyZ2V0RE9NID0gbmV3IFhwcDNEb20oInVybCIpOwotICAgICAgdGFyZ2V0RE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIHRhcmdldFVSTCk7Ci0gICAgICB0YXJnZXRET00uc2V0QXR0cmlidXRlKCJuIiwgInRhcmdldFVSTCIpOwotICAgICAgZGVmYXVsdERPTS5hZGRDaGlsZCh0YXJnZXRET00pOwotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5VGFnTGlicmFyaWVzKEZpbGUgcHJvamVjdERpciwgTGlzdCBkZXBlbmRlbmNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgYXJ0aWZhY3RzKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShwcm9qZWN0RGlyLCAic3JjL21haW4vd2ViYXBwL1dFQi1JTkYiKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IChEZXBlbmRlbmN5KSBpLm5leHQoKTsKLSAgICAgIE1hdmVuUHJvamVjdCBkZXBlbmRlbnRQcm9qZWN0ID0KLSAgICAgICAgZmluZERlcGVuZGVudFByb2plY3QoZGVwZW5kZW5jeS5nZXRNYW5hZ2VtZW50S2V5KCkpOwotICAgICAgaWYgKGRlcGVuZGVudFByb2plY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCByZXNvdXJjZVJvb3RzID0gZGVwZW5kZW50UHJvamVjdC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gcmVzb3VyY2VSb290cy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGoubmV4dCgpOwotICAgICAgICAgIFN0cmluZyByZXNvdXJjZVJvb3QgPSByZXNvdXJjZS5nZXREaXJlY3RvcnkoKTsKLSAgICAgICAgICBGaWxlIHJlc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUocmVzb3VyY2VSb290KTsKLSAgICAgICAgICBpZiAocmVzb3VyY2VEaXJlY3RvcnkuZXhpc3RzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgICAgICAgIHNjYW5uZXIuc2V0QmFzZWRpcihyZXNvdXJjZVJvb3QpOwotICAgICAgICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgICAgIHNjYW5uZXIuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdCi0gICAgICAgICAgICAgICAgeyAiTUVUQS1JTkYvKi50bGQiIH0pOwotICAgICAgICAgICAgc2Nhbm5lci5zY2FuKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHRsZEZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHRsZEZpbGVzLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZURpcmVjdG9yeSwgdGxkRmlsZXNba10pOwotICAgICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKHNvdXJjZUZpbGUsIHRhcmdldEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotCi0gICAgTWFwIHNvdXJjZU1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaS5uZXh0KCk7Ci0gICAgICBpZiAoIWlzRGVwZW5kZW50UHJvamVjdChhcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpKSAmJgotICAgICAgICAgICJqYXIiLmVxdWFscyhhcnRpZmFjdC5nZXRUeXBlKCkpKQotICAgICAgewotICAgICAgICBGaWxlIGZpbGUgPSBhcnRpZmFjdC5nZXRGaWxlKCk7Ci0gICAgICAgIEphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUpOwotICAgICAgICBFbnVtZXJhdGlvbiBqYXJFbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7Ci0gICAgICAgIHdoaWxlIChqYXJFbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgSmFyRW50cnkgamFyRW50cnkgPSAoSmFyRW50cnkpIGphckVudHJpZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IGphckVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORi8iKSAmJiBuYW1lLmVuZHNXaXRoKCIudGxkIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdCB0YWdsaWJzID0gKExpc3QpIHNvdXJjZU1hcC5nZXQobmFtZSk7Ci0gICAgICAgICAgICBpZiAodGFnbGlicyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0YWdsaWJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICBzb3VyY2VNYXAucHV0KG5hbWUsIHRhZ2xpYnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YWdsaWJzLmFkZChmaWxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7Ci0gICAgICBMaXN0IHRhZ2xpYnMgPSAoTGlzdCkgZS5nZXRWYWx1ZSgpOwotICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLmdldEtleSgpOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIHRpID0gdGFnbGlicy5pdGVyYXRvcigpOyB0aS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpIHRpLm5leHQoKTsKLSAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICh0YWdsaWJzLnNpemUoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgamFyTmFtZSA9Ci0gICAgICAgICAgICBmaWxlLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgZmlsZS5nZXROYW1lKCkubGVuZ3RoKCkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuamFyIi5sZW5ndGgoKSk7Ci0gICAgICAgICAgYnVmZi5pbnNlcnQoYnVmZi5sZW5ndGgoKSAtICIudGxkIi5sZW5ndGgoKSwgIi0iICsgamFyTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBVUkwgamFyVVJMID0gZmlsZS50b1VSTCgpOwotICAgICAgICBVUkwgc291cmNlVVJMID0KLSAgICAgICAgICBuZXcgVVJMKCJqYXI6IiArIGphclVSTC50b0V4dGVybmFsRm9ybSgpICsgIiEvIiArIG5hbWUpOwotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIGJ1ZmYudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmICh0YXJnZXRGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlVXRpbHMuY29weVVSTFRvRmlsZShzb3VyY2VVUkwsIHRhcmdldEZpbGUpOwotICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VPdXRwdXREaXJlY3RvcnkoRmlsZSBwcm9qZWN0RGlyLCBGaWxlIG91dHB1dERpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvanByOnByb2plY3QKLSAgICAvLyAgIC9oYXNoW0BuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiXQotCi0gICAgWHBwM0RvbSBwcm9qZWN0UGF0aHNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLCAib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdFBhdGhzIik7Ci0gICAgWHBwM0RvbSBzb3VyY2VET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0KLSAgICAvLwotICAgIC8vIDx1cmwgQG49Im91dHB1dERpcmVjdG9yeSIgcGF0aD0iW3JlbGF0aXZlLXBhdGgtdG8tb3V0cHV0LWRpcl0iIC8+Ci0gICAgLy8KLSAgICBzb3VyY2VET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgZ2V0UmVsYXRpdmVEaXIocHJvamVjdERpciwgb3V0cHV0RGlyKSk7Ci0gICAgc291cmNlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJvdXRwdXREaXJlY3RvcnkiKTsKLSAgICBwcm9qZWN0UGF0aHNET00uYWRkQ2hpbGQoc291cmNlRE9NKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKRGV2ZWxvcGVyIHByb2plY3QgZmlsZSBmb3IgYSBNYXZlbiBQT00uCi0gICAqCi0gICAqIEBwYXJhbSBwcm9qZWN0ICB0aGUgTWF2ZW4gUE9NCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKRGV2ZWxvcGVyIHByb2plY3QgZmlsZQotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGdldEpQcm9qZWN0RmlsZShNYXZlblByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFN0cmluZyBqcHJOYW1lID0gcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiLmpwciI7Ci0gICAgcmV0dXJuIG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCBqcHJOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKRGV2ZWxvcGVyIHRlc3QgcHJvamVjdCBmaWxlIGZvciBhIE1hdmVuIFBPTS4KLSAgICoKLSAgICogQHBhcmFtIHByb2plY3QgIHRoZSBNYXZlbiBQT00KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpEZXZlbG9wZXIgdGVzdCBwcm9qZWN0IGZpbGUKLSAgICovCi0gIHByaXZhdGUgRmlsZSBnZXRKUHJvamVjdFRlc3RGaWxlKE1hdmVuUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgU3RyaW5nIGpwck5hbWUgPSBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICItdGVzdC5qcHIiOwotICAgIHJldHVybiBuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwganByTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSkRldmVsb3BlciB3b3Jrc3BhY2UgZmlsZSBmb3IgYSBNYXZlbiBQT00uCi0gICAqCi0gICAqIEBwYXJhbSBwcm9qZWN0ICB0aGUgTWF2ZW4gUE9NCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKRGV2ZWxvcGVyIHdvcmtzcGFjZSBmaWxlCi0gICAqLwotICBwcml2YXRlIEZpbGUgZ2V0SldvcmtzcGFjZUZpbGUoTWF2ZW5Qcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBTdHJpbmcgandzTmFtZSA9IHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi5qd3MiOwotICAgIHJldHVybiBuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgandzTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYSBKRGV2ZWxvcGVyIHdvcmtzcGFjZSBmaWxlIGludG8gRE9NLgotICAgKgotICAgKiBAcGFyYW0gd29ya3NwYWNlRmlsZSAgdGhlIEpEZXZlbG9wZXIgd29ya3NwYWNlIGZpbGUKLSAgICoKLSAgICogQHJldHVybiB0aGUgcGFyc2VkIERPTQotICAgKi8KLSAgcHJpdmF0ZSBYcHAzRG9tIHJlYWRXb3Jrc3BhY2VET00oRmlsZSB3b3Jrc3BhY2VGaWxlKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRET00od29ya3NwYWNlRmlsZSwgcmVsZWFzZSArICIvd29ya3NwYWNlLnhtbCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgSkRldmVsb3BlciBwcm9qZWN0IGZpbGUgaW50byBET00uCi0gICAqCi0gICAqIEBwYXJhbSBwcm9qZWN0RmlsZSAgdGhlIEpEZXZlbG9wZXIgcHJvamVjdCBmaWxlCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHBhcnNlZCBET00KLSAgICovCi0gIHByaXZhdGUgWHBwM0RvbSByZWFkUHJvamVjdERPTShGaWxlIHByb2plY3RGaWxlKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRET00ocHJvamVjdEZpbGUsIHJlbGVhc2UgKyAiL3Byb2plY3QueG1sIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYSBzb3VyY2UgZmlsZSBpbnRvIERPTSwgZGVmYXVsdGluZyB0byBhIHBhY2thZ2VkIHJlc291cmNlIGlmCi0gICAqIHRoZSBzb3VyY2UgZmlsZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotICAgKgotICAgKiBAcGFyYW0gc291cmNlRmlsZSAgICB0aGUgc291cmNlIGZpbGUgdG8gYmUgcGFyc2VkCi0gICAqIEBwYXJhbSByZXNvdXJjZVBhdGggIHRoZSBkZWZhdWx0IHBhY2thZ2VkIHJlc291cmNlCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHBhcnNlZCBET00KLSAgICovCi0gIHByaXZhdGUgWHBwM0RvbSByZWFkRE9NKEZpbGUgc291cmNlRmlsZSwgU3RyaW5nIHJlc291cmNlUGF0aCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghZm9yY2UgJiYgc291cmNlRmlsZS5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gcGFyc2UgdGhlIGV4aXN0aW5nIHNvdXJjZSBmaWxlCi0gICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNvdXJjZUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBwYXJzZSB0aGUgZGVmYXVsdCByZXNvdXJjZSBmaWxlCi0gICAgICAgIFVSTCByZXNvdXJjZSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VQYXRoKTsKLQotICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgcmVzb3VyY2VQYXRoIGNhbiBiZSBmb3VuZAotICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHJlYWQgcmVzb3VyY2U6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlLm9wZW5TdHJlYW0oKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gWHBwM0RvbUJ1aWxkZXIuYnVpbGQocmVhZGVyKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIElPVXRpbC5jbG9zZShyZWFkZXIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBYTUwgRE9NIHRvIHRoZSB0YXJnZXQgZmlsZS4KLSAgICoKLSAgICogQHBhcmFtIHRhcmdldEZpbGUgIHRoZSB0YXJnZXQgZmlsZQotICAgKiBAcGFyYW0gc291cmNlRE9NICAgdGhlIHNvdXJjZSBET00KLSAgICovCi0gIHByaXZhdGUgdm9pZCB3cml0ZURPTShGaWxlIHRhcmdldEZpbGUsIFhwcDNEb20gc291cmNlRE9NKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZpbGUpOwotICAgICAgWHBwM0RvbVdyaXRlci53cml0ZSh3cml0ZXIsIHNvdXJjZURPTSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBJT1V0aWwuY2xvc2Uod3JpdGVyKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZURpcihGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKHNvdXJjZSwgdGFyZ2V0LCB0cnVlKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlRmlsZShGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKHNvdXJjZSwgdGFyZ2V0LCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHR3byBmaWxlcy4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSAgdGhlIHNvdXJjZSBmaWxlCi0gICAqIEBwYXJhbSB0YXJnZXQgIHRoZSB0YXJnZXQgZmlsZQotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHR3byBmaWxlcwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEaXJlY3RvcnkpCi0gIHsKLSAgICBTdHJpbmcgc291cmNlUGF0aCA9IHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICBTdHJpbmcgdGFyZ2V0UGF0aCA9IHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotICAgIGlmICh0YXJnZXRQYXRoLnN0YXJ0c1dpdGgoc291cmNlUGF0aCArIEZpbGUuc2VwYXJhdG9yQ2hhcikpCi0gICAgewotICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHRhcmdldFBhdGguc3Vic3RyaW5nKHNvdXJjZVBhdGgubGVuZ3RoKCkgKyAxKTsKLSAgICAgIHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLSAgICAgIGlmIChpc0RpcmVjdG9yeSkKLSAgICAgIHsKLSAgICAgICAgcmVsYXRpdmVQYXRoICs9ICIvIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBzb3VyY2VQYXRocyA9IHNvdXJjZVBhdGguc3BsaXQoIlxcIiArIEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgIFN0cmluZ1tdIHRhcmdldFBhdGhzID0gdGFyZ2V0UGF0aC5zcGxpdCgiXFwiICsgRmlsZS5zZXBhcmF0b3IpOwotCi0gICAgICAvLyBPbiBXaW5kb3dzLCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYWJzb2x1dGUgcGF0aCBpcyBhIGRyaXZlIGxldHRlcgotICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkKLSAgICAgIHsKLSAgICAgICAgLy8gdXBwZXJjYXNlIHRoZSBkcml2ZSBsZXR0ZXIgYmVjYXVzZSBDeWd3aW4gc29tZXRpbWVzIGRlbGl2ZXJzCi0gICAgICAgIC8vIGEgbG93ZXJjYXNlIGRyaXZlIGxldHRlcgotICAgICAgICBzb3VyY2VQYXRoc1swXSA9IHNvdXJjZVBhdGhzWzBdLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIHRhcmdldFBhdGhzWzBdID0gdGFyZ2V0UGF0aHNbMF0udG9VcHBlckNhc2UoKTsKLSAgICAgIH0KLQotICAgICAgaW50IHNvdXJjZVBhdGhDb3VudCA9IHNvdXJjZVBhdGhzLmxlbmd0aDsKLSAgICAgIGludCB0YXJnZXRQYXRoQ291bnQgPSB0YXJnZXRQYXRocy5sZW5ndGg7Ci0gICAgICBpbnQgY29tbW9uUGF0aENvdW50ID0gMDsKLQotICAgICAgaW50IG1pblBhdGhDb3VudCA9IE1hdGgubWluKHNvdXJjZVBhdGhDb3VudCwgdGFyZ2V0UGF0aENvdW50KTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluUGF0aENvdW50OyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChzb3VyY2VQYXRoc1tpXS5lcXVhbHModGFyZ2V0UGF0aHNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbW9uUGF0aENvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGNvbW1vblBhdGhDb3VudCA+IDApCi0gICAgICB7Ci0gICAgICAgIGludCBzb3VyY2VSZWxhdGl2ZVBhdGhDb3VudCA9IHNvdXJjZVBhdGhDb3VudCAtIGNvbW1vblBhdGhDb3VudDsKLSAgICAgICAgaW50IHRhcmdldFJlbGF0aXZlUGF0aENvdW50ID0gdGFyZ2V0UGF0aENvdW50IC0gY29tbW9uUGF0aENvdW50OwotCi0gICAgICAgIGludCByZWxhdGl2ZVBhdGhDb3VudCA9Ci0gICAgICAgICAgc291cmNlUmVsYXRpdmVQYXRoQ291bnQgKyB0YXJnZXRSZWxhdGl2ZVBhdGhDb3VudDsKLSAgICAgICAgU3RyaW5nW10gcmVsYXRpdmVQYXRocyA9IG5ldyBTdHJpbmdbcmVsYXRpdmVQYXRoQ291bnRdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUmVsYXRpdmVQYXRoQ291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHJlbGF0aXZlUGF0aHNbaV0gPSAiLi4iOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRSZWxhdGl2ZVBhdGhDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgcmVsYXRpdmVQYXRoc1tzb3VyY2VSZWxhdGl2ZVBhdGhDb3VudCArIGldID0KLSAgICAgICAgICAgICAgdGFyZ2V0UGF0aHNbY29tbW9uUGF0aENvdW50ICsgaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBqb2luCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZWxhdGl2ZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRpdmVQYXRoQ291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWxhdGl2ZVBhdGguYXBwZW5kKCIvIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlbGF0aXZlUGF0aC5hcHBlbmQocmVsYXRpdmVQYXRoc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aC50b1N0cmluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gdGFyZ2V0UGF0aDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFhwcDNEb20gZmluZE5hbWVkQ2hpbGQoWHBwM0RvbSBwYXJlbnQsIFN0cmluZyBjaGlsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlKQotICB7Ci0gICAgWHBwM0RvbVtdIGhhc2ggPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oY2hpbGROYW1lKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhc2gubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGF0dHJWYWx1ZS5lcXVhbHMoaGFzaFtpXS5nZXRBdHRyaWJ1dGUoIm4iKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBoYXNoW2ldOwotICAgICAgfQotICAgIH0KLQotICAgIFhwcDNEb20gY2hpbGQgPSBuZXcgWHBwM0RvbShjaGlsZE5hbWUpOwotICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgibiIsIGF0dHJWYWx1ZSk7Ci0gICAgcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLQotICAgIHJldHVybiBjaGlsZDsKLSAgfQotCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IGZpbmREZXBlbmRlbnRQcm9qZWN0KFN0cmluZyBkZXBlbmRlbmN5TWFuYWdlbWVudEtleSkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlYWN0b3JQcm9qZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE1hdmVuUHJvamVjdCByZWFjdG9yUHJvamVjdCA9IChNYXZlblByb2plY3QpIGkubmV4dCgpOwotICAgICAgU3RyaW5nIGlkZW50ID0KLSAgICAgICAgcmVhY3RvclByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpOwotICAgICAgaWYgKGlkZW50LmVxdWFscyhkZXBlbmRlbmN5TWFuYWdlbWVudEtleSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiByZWFjdG9yUHJvamVjdC5nZXRFeGVjdXRpb25Qcm9qZWN0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNEZXBlbmRlbnRQcm9qZWN0KFN0cmluZyBkZXBlbmRlbmN5TWFuYWdlbWVudEtleSkKLSAgewotICAgIHJldHVybiAoZmluZERlcGVuZGVudFByb2plY3QoZGVwZW5kZW5jeU1hbmFnZW1lbnRLZXkpICE9IG51bGwpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkcmVuKFhwcDNEb20gcGFyZW50KQotICB7Ci0gICAgd2hpbGUgKHBhcmVudC5nZXRDaGlsZENvdW50KCkgIT0gMCkKLSAgICB7Ci0gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoMCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBYcHAzRG9tIGNyZWF0ZVByb2plY3RSZWZlcmVuY2VET00oRmlsZSB3b3Jrc3BhY2VEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcHJvamVjdEZpbGUpCi0gIHsKLSAgICBYcHAzRG9tIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgIFhwcDNEb20gdXJsRE9NID0gbmV3IFhwcDNEb20oInVybCIpOwotICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiVVJMIik7Ci0gICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIGdldFJlbGF0aXZlRmlsZSh3b3Jrc3BhY2VEaXIsIHByb2plY3RGaWxlKSk7Ci0gICAgCi0gICAgaWYgKF9yZWxlYXNlTWFqb3IgPCAxMSkKLSAgICB7Ci0gICAgICBYcHAzRG9tIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAibm9kZUNsYXNzIik7Ci0gICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSlByb2plY3QiKTsKLSAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotICAgIH0KLSAgICBoYXNoRE9NLmFkZENoaWxkKHVybERPTSk7Ci0gICAgcmV0dXJuIGhhc2hET007Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3BhcnNlUmVsZWFzZSgpCi0gIHsKLSAgICBTdHJpbmcgbnVtc1tdID0gcmVsZWFzZS5zcGxpdCgiXFwuIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgX3JlbGVhc2VNYWpvciA9IEludGVnZXIucGFyc2VJbnQobnVtc1swXSk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBEZWZhdWx0IHJlbGVhc2UgaXMgY3VycmVudGx5IDEwLngKLSAgICAgIF9yZWxlYXNlTWFqb3IgPSAxMDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCAgICAgX3JlbGVhc2VNYWpvciA9IDA7Ci0gIHByaXZhdGUgYm9vbGVhbiBfYWRkTGlicmFyaWVzID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIF9hZGRUYWdMaWJzICAgPSB0cnVlOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfUFJPUEVSVFlfQUREX0xJQlJBUlkgPSAiamRldi5wbHVnaW4uYWRkLmxpYnJhcmllcyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfUFJPUEVSVFlfQUREX1RBR0xJQlMgPSAiamRldi5wbHVnaW4uYWRkLnRhZ2xpYnMiOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL1RsZENvbnRlbnRIYW5kbGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL1RsZENvbnRlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDQ5ODcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci9UbGRDb250ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qZGV2ZWxvcGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRsZENvbnRlbnRIYW5kbGVyCi17Ci0gIC8qKgotICAgICogQ29udGVudCBIYW5kbGVyLgotICAgICovCi0gIHB1YmxpYyBUbGRDb250ZW50SGFuZGxlcigpCi0gIHsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBQYXJzZSB0aGUgLnRsZCBmaWxlIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gCi0gICAgKiBuZWVkZWQgZm9yIHRoZSAuanByCi0gICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VUbGQoRmlsZSBmaWxlKQotICB0aHJvd3MgU0FYRXhjZXB0aW9uLAotICAgICAgICAgSU9FeGNlcHRpb24sCi0gICAgICAgICBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYSBidWlsZGVyIGZhY3RvcnkKLSAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgdGhlIEJ1aWxkZXIgYW5kIHBhcnNlIHRoZSBmaWxlCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKGZpbGUpOwotICAgIAotICAgIF9wcm9jZXNzVGxkTm9kZXMoZG9jdW1lbnQpOwotICB9Ci0KLSAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAqIEdldHRvcnMgYW5kIHNldHRvcnMKLSAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotICAgIF92ZXJzaW9uID0gdmVyc2lvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBfbmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIF9wcmVmaXggPSBwcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIF91cmkgPSB1cmk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRKc3BWZXJzaW9uKFN0cmluZyBqc3BWZXJzaW9uKQotICB7Ci0gICAgX2pzcFZlcnNpb24gPSBqc3BWZXJzaW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiBfdmVyc2lvbiA9PSBudWxsPyAiIiA6IF92ZXJzaW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBfbmFtZSA9PSBudWxsPyAiIiA6IF9uYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQotICB7Ci0gICAgcmV0dXJuIF9wcmVmaXggPT0gbnVsbD8gIiIgOiBfcHJlZml4OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIF91cmkgPT0gbnVsbD8gIiIgOiBfdXJpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRKc3BWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiBfanNwVmVyc2lvbiA9PSBudWxsPyAiIiA6IF9qc3BWZXJzaW9uOwotICB9Ci0KLQotICAvKioKLSAgICAqIEZpbmQgYWxsIHRoZSBUTEQgbm9kZXMgd2Ugd2FudCwgZ2V0IGVhY2ggbm9kZSdzIHZhbHVlCi0gICAgKiBhbmQgc2V0IHRoZSB2YWx1ZSBvbiB0aGUgcHJvcGVyIGNsYXNzIHByb3BlcnR5LgotICAgICogCi0gICAgKiBAcGFyYW0gZG9jdW1lbnQgIC0gRE9NIERvY3VtZW50IGZyb20gdGhlIFRMRCBmaWxlCi0gICAgKi8gIAotICBwcml2YXRlIHZvaWQgX3Byb2Nlc3NUbGROb2RlcyhEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBOb2RlcyBmaXJzdCBub2RlLiAgV2UgY2FuIGJlIHNwZWNpZmljIGhlcmUKLSAgICAvLyBiZWNhdXNlIHdlIGtub3cgd2Ugd2FudCB0aGUgZmlyc3Qgbm9kZS4KLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKF9UTElCX1ZFUlNJT04pOwotICAgIGlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgewotICAgICAgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICBzZXRWZXJzaW9uKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKF9KU1BfVkVSU0lPTik7Ci0gICAgaWYgKG5vZGVMaXN0ICE9IG51bGwgJiYgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkKLSAgICB7Ci0gICAgICBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgIHNldEpzcFZlcnNpb24obm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgIH0KLQotICAgIC8vIE11c3QgZ28gYmVmb3JlIF9ESVNQTEFZX05BTUUKLSAgICBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKF9TSE9SVF9OQU1FKTsKLSAgICBpZiAobm9kZUxpc3QgIT0gbnVsbCAmJiBub2RlTGlzdC5nZXRMZW5ndGgoKSAhPSAwKQotICAgIHsKLSAgICAgIG5vZGUgPSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgc2V0UHJlZml4KG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBNdXN0IGdvIGFmdGVyIF9TSE9SVF9OQU1FCi0gICAgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShfRElTUExBWV9OQU1FKTsKLSAgICBpZiAobm9kZUxpc3QgIT0gbnVsbCAmJiBub2RlTGlzdC5nZXRMZW5ndGgoKSAhPSAwKQotICAgIHsKLSAgICAgIG5vZGUgPSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgc2V0TmFtZShub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXROYW1lKGdldFByZWZpeCgpKTsKLSAgICB9Ci0KLSAgICBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKF9VUkkpOwotICAgIGlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgewotICAgICAgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICBzZXRVUkkobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgIH0KLSAgfQotICAKLSAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gUHJpdmF0ZSB2YXJpYWJsZXMKLSAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIF92ZXJzaW9uICAgID0gbnVsbDsgLy8gdGxpYi12ZXJzaW9uCi0gIHByaXZhdGUgU3RyaW5nIF9uYW1lICAgICAgID0gbnVsbDsgLy8gZGlzcGxheS1uYW1lCi0gIHByaXZhdGUgU3RyaW5nIF9wcmVmaXggICAgID0gbnVsbDsgLy8gc2hvcnQtbmFtZQotICBwcml2YXRlIFN0cmluZyBfanNwVmVyc2lvbiA9IG51bGw7IC8vIGpzcC12ZXJzaW9uCi0gIHByaXZhdGUgU3RyaW5nIF91cmkgICAgICAgID0gbnVsbDsgLy8gdXJpCi0gCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVExJQl9WRVJTSU9OID0gInRsaWItdmVyc2lvbiI7IC8vdmVyc2lvbiBOT1RSQU5TCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfRElTUExBWV9OQU1FID0gImRpc3BsYXktbmFtZSI7IC8vbmFtZSBOT1RSQU5TCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfU0hPUlRfTkFNRSAgID0gInNob3J0LW5hbWUiOyAgIC8vcHJlZml4IE5PVFJBTlMKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9KU1BfVkVSU0lPTiAgPSAianNwLXZlcnNpb24iOyAgIC8vTk9UUkFOUwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX1VSSSAgICAgICAgICA9ICJ1cmkiOwotfSAvLyBlbmRjbGFzcyBUbGRDb250ZW50SGFuZGxlcgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjIvcHJvamVjdC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyODZmZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGpwcjpwcm9qZWN0IHhtbG5zOmpwcj0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vaWRlL3Byb2plY3QiID4KLSAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIiA+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLnN0cnV0cy5hZGRpbi5TdHJ1dHNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjIiIC8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMiIgLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lREJQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjIiIC8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5qc3AuSnNwTWlncmF0b3IiIHY9IjEwLjEuMy4wLjIiIC8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4yIiAvPgotICA8L2hhc2g+Ci0gIDxsaXN0IG49ImNvbnRlbnRTZXRzIiA+Ci0gICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5QYXRoc0NvbmZpZ3VyYXRpb24vamF2YUNvbnRlbnRTZXQiIC8+Ci0gICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5yZXNvdXJjZXMuUmVzb3VyY2VQYXRocy9yZXNvdXJjZXNDb250ZW50U2V0IiAvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzL3dlYkNvbnRlbnRTZXQiIC8+Ci0gIDwvbGlzdD4KLSAgPGhhc2ggbj0ib3JhY2xlLmlkZS5tb2RlbC5EZXBlbmRlbmN5Q29uZmlndXJhdGlvbiIgPgotICAgIDxsaXN0IG49ImRlcGVuZGVuY3lMaXN0IiAvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmNvbXBpbGVyLk9qY0NvbmZpZ3VyYXRpb24iID4KLSAgICA8dmFsdWUgbj0iYXNzZXJ0aW9uc0VuYWJsZWQiIHY9InRydWUiIC8+Ci0gICAgPGxpc3Qgbj0iY29weVJlcyIgPgotICAgICAgPHN0cmluZyB2PSIuamF2YSIgLz4KLSAgICA8L2xpc3Q+Ci0gICAgPHZhbHVlIG49InJldmVyc2VDb3B5UmVzIiB2PSJ0cnVlIiAvPgotICAgIDx2YWx1ZSBuPSJpbnRlcm5hbEVuY29kaW5nIiB2PSJEZWZhdWx0IiAvPgotICAgIDx2YWx1ZSBuPSJzaG93T2JqZWN0RG90U3RhdGljV2FybmluZ3MiIHY9InRydWUiIC8+Ci0gICAgPHZhbHVlIG49InNob3dQYXJ0aWFsSW1wb3J0V2FybmluZ3MiIHY9InRydWUiIC8+Ci0gICAgPHZhbHVlIG49InNob3dVbnVzZWRJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIgLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiID4KLSAgICA8dmFsdWUgbj0iajJlZVdlYkFwcE5hbWUiIHY9Im1hdmVuLWdlbmVyYXRlZC13ZWJhcHAiIC8+Ci0gICAgPHZhbHVlIG49ImoyZWVXZWJDb250ZXh0Um9vdCIgdj0ibWF2ZW4tZ2VuZXJhdGVkLWNvbnRleHQtcm9vdCIgLz4KLSAgICA8aGFzaCBuPSJ3ZWJDb250ZW50U2V0IiA+Ci0gICAgICA8bGlzdCBuPSJ1cmwtcGF0aCIgLz4KLSAgICA8L2hhc2g+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIiA+Ci0gICAgPGhhc2ggbj0iamF2YUNvbnRlbnRTZXQiID4KLSAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyIgPgotICAgICAgICA8c3RyaW5nIHY9IisqKiIgLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5yZXNvdXJjZXMuUmVzb3VyY2VQYXRocyIgPgotICAgIDxoYXNoIG49InJlc291cmNlc0NvbnRlbnRTZXQiID4KLSAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyIgPgotICAgICAgICA8c3RyaW5nIHY9IisqKiIgLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0TGlicmFyaWVzIiA+Ci0gICAgPGxpc3Qgbj0iZXhwb3J0ZWRSZWZlcmVuY2VzIiAvPgotICAgIDxoYXNoIG49ImludGVybmFsRGVmaW5pdGlvbnMiID4KLSAgICAgIDxsaXN0IG49ImxpYnJhcnlEZWZpbml0aW9ucyIgLz4KLSAgICA8L2hhc2g+Ci0gICAgPGxpc3Qgbj0ibGlicmFyeVJlZmVyZW5jZXMiIC8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdFBhdGhzIiA+Ci0gICAgPHVybCBuPSJvdXRwdXREaXJlY3RvcnkiIC8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLndlYmFwcC5qc3AubGlicmFyaWVzLm1vZGVsLlByb2plY3RUYWdMaWJyYXJpZXMiID4KLSAgICA8aGFzaCBuPSJsaWJyYXJpZXMiIC8+Ci0gIDwvaGFzaD4KLTwvanByOnByb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjIvd29ya3NwYWNlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC4yL3dvcmtzcGFjZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjFhZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjIvd29ya3NwYWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGp3czp3b3Jrc3BhY2UgeG1sbnM6andzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+Ci0gIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMiIvPgotICA8L2hhc2g+Ci0gIDxsaXN0IG49Imxpc3RPZkNoaWxkcmVuIiAvPgotPC9qd3M6d29ya3NwYWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC4zL3Byb2plY3QueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNjAwNmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08anByOnByb2plY3QgeG1sbnM6anByPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+Ci0gICA8aGFzaCBuPSJjb21wb25lbnQtdmVyc2lvbnMiPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5hZGYuZHQubWlncmF0aW9uLlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLmpzZi5hZGRpbi5KU0ZQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uZGIuQURGU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuc3RydXRzLmFkZGluLlN0cnV0c1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmJtLmNvbW1vbklkZS5Qcm9qZWN0VXBncmFkZXIiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuaWRlLm1vZGVsLlByb2plY3QiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRoc01pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpiby5kdC5qY2xpZW50Lm1pZ3JhdG9yLkpDUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpiby5kdC5qZGV2eC51aS5hcHBuYXYuQVBQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmVsb3Blci5kYm1vZGVsZXIubWlncmF0aW9uLlByb2plY3RNaWdyYXRvckhlbHBlciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5taWdyYXRpb24uT2ZmbGluZURCUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwuanNwLkpzcE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zTWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwud2Vic2VydmljZXMuV2ViU2VydmljZXNNaWdyYXRvckhlbHBlciIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4ubWlncmF0aW9uLlRvcExpbmtQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgIDwvaGFzaD4KLSAgIDxsaXN0IG49ImNvbnRlbnRTZXRzIj4KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uL2phdmFDb250ZW50U2V0Ii8+Ci0gICAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncy93ZWJDb250ZW50U2V0Ii8+Ci0gICAgICA8c3RyaW5nIHY9Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocy9yZXNvdXJjZXNDb250ZW50U2V0Ii8+Ci0gICA8L2xpc3Q+Ci0gICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIj4KLSAgICAgIDxsaXN0IG49ImRlcGVuZGVuY3lMaXN0Ii8+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLlJlc291cmNlUGF0aHMiPgotICAgICAgPGhhc2ggbj0icmVzb3VyY2VzQ29udGVudFNldCI+Ci0gICAgICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPgotICAgICAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgICAgIDwvbGlzdD4KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgICAgPC9oYXNoPgotICAgPC9oYXNoPgotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIuY29tcGlsZXIuT2pjQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8dmFsdWUgbj0iYXNzZXJ0aW9uc0VuYWJsZWQiIHY9InRydWUiLz4KLSAgICAgIDxsaXN0IG49ImNvcHlSZXMiPgotICAgICAgICAgPHN0cmluZyB2PSIuamF2YSIvPgotICAgICAgPC9saXN0PgotICAgICAgPHZhbHVlIG49ImludGVybmFsRW5jb2RpbmciIHY9IkRlZmF1bHQiLz4KLSAgICAgIDx2YWx1ZSBuPSJyZXZlcnNlQ29weVJlcyIgdj0idHJ1ZSIvPgotICAgICAgPHZhbHVlIG49InNob3dPYmplY3REb3RTdGF0aWNXYXJuaW5ncyIgdj0idHJ1ZSIvPgotICAgICAgPHZhbHVlIG49InNob3dQYXJ0aWFsSW1wb3J0V2FybmluZ3MiIHY9InRydWUiLz4KLSAgICAgIDx2YWx1ZSBuPSJzaG93VW51c2VkSW1wb3J0V2FybmluZ3MiIHY9InRydWUiLz4KLSAgICAgIDx2YWx1ZSBuPSJ1c2VKYXZhYyIgdj0idHJ1ZSIvPgotICAgPC9oYXNoPgotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzIj4KLSAgICAgIDx2YWx1ZSBuPSJqMmVlV2ViQXBwTmFtZSIgdj0ibWF2ZW4tZ2VuZXJhdGVkLXdlYmFwcCIvPgotICAgICAgPHZhbHVlIG49ImoyZWVXZWJDb250ZXh0Um9vdCIgdj0ibWF2ZW4tZ2VuZXJhdGVkLWNvbnRleHQtcm9vdCIvPgotICAgICAgPGhhc2ggbj0id2ViQ29udGVudFNldCI+Ci0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCIgLz4KLSAgICAgIDwvaGFzaD4KLSAgIDwvaGFzaD4KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8aGFzaCBuPSJqYXZhQ29udGVudFNldCI+Ci0gICAgICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPgotICAgICAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgICAgIDwvbGlzdD4KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgICAgPC9oYXNoPgotICAgPC9oYXNoPgotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyI+Ci0gICAgICA8bGlzdCBuPSJleHBvcnRlZFJlZmVyZW5jZXMiLz4KLSAgICAgIDxoYXNoIG49ImludGVybmFsRGVmaW5pdGlvbnMiPgotICAgICAgICAgPGxpc3Qgbj0ibGlicmFyeURlZmluaXRpb25zIiAvPgotICAgICAgPC9oYXNoPgotICAgICAgPGxpc3Qgbj0ibGlicmFyeVJlZmVyZW5jZXMiIC8+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiPgotICAgICAgPHVybCBuPSJvdXRwdXREaXJlY3RvcnkiIC8+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyI+Ci0gICAgICA8aGFzaCBuPSJsaWJyYXJpZXMiLz4KLSAgIDwvaGFzaD4KLTwvanByOnByb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvd29ya3NwYWNlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC4zL3dvcmtzcGFjZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDhkOWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvd29ya3NwYWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdVVEYtOCc/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqd3M6d29ya3NwYWNlIHhtbG5zOmp3cz0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vaWRlL3Byb2plY3QiPgotICAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIj4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuaWRlLm1vZGVsLlByb2plY3QiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMyIvPgotICAgPC9oYXNoPgotICAgPGxpc3Qgbj0ibGlzdE9mQ2hpbGRyZW4iIC8+Ci08L2p3czp3b3Jrc3BhY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjQvcHJvamVjdC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4MTRkMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08anByOnByb2plY3QgeG1sbnM6anByPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+Ci0gIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGYuZHQubWlncmF0aW9uLlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLmpzZi5hZGRpbi5KU0ZQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uZGIuQURGU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuc3RydXRzLmFkZGluLlN0cnV0c1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmJtLmNvbW1vbklkZS5Qcm9qZWN0VXBncmFkZXIiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuaWRlLm1vZGVsLlByb2plY3QiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRoc01pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpiby5kdC5qY2xpZW50Lm1pZ3JhdG9yLkpDUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpiby5kdC5qZGV2eC51aS5hcHBuYXYuQVBQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmVsb3Blci5kYm1vZGVsZXIubWlncmF0aW9uLlByb2plY3RNaWdyYXRvckhlbHBlciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5taWdyYXRpb24uT2ZmbGluZURCUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwuanNwLkpzcE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zTWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwud2Vic2VydmljZXMuV2ViU2VydmljZXNNaWdyYXRvckhlbHBlciIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4ubWlncmF0aW9uLlRvcExpbmtQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICA8L2hhc2g+Ci0gIDxsaXN0IG49ImNvbnRlbnRTZXRzIj4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbi9qYXZhQ29udGVudFNldCIvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzL3dlYkNvbnRlbnRTZXQiLz4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocy9yZXNvdXJjZXNDb250ZW50U2V0Ii8+Ci0gICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5vZmZsaW5lZGIubW9kZWwuT2ZmbGluZURCUHJvamVjdFNldHRpbmdzL29mZmxpbmVEQkNvbnRlbnRTZXQiLz4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS50b3BsaW5rLmFkZGluLlRvcExpbmtQcm9qZWN0U2V0dGluZ3MvdG9wbGlua0NvbnRlbnRTZXQiLz4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5ibS5jb21tb25JZGUuZGF0YS5wcm9qZWN0Lk1vZGVsZXJQcm9qZWN0U2V0dGluZ3MvbW9kZWxlcnNDb250ZW50U2V0Ii8+Ci0gIDwvbGlzdD4KLSAgPGhhc2ggbj0ib3JhY2xlLmJtLmNvbW1vbklkZS5kYXRhLnByb2plY3QuTW9kZWxlclByb2plY3RTZXR0aW5ncyI+Ci0gICAgPGhhc2ggbj0ibW9kZWxlcnNDb250ZW50U2V0Ij4KLSAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+Ci0gICAgICAgIDxzdHJpbmcgdj0iKyoqIi8+Ci0gICAgICA8L2xpc3Q+Ci0gICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+Ci0gICAgICAgIDx1cmwgcGF0aD0ibW9kZWwvIi8+Ci0gICAgICA8L2xpc3Q+Ci0gICAgPC9oYXNoPgotICAgIDx2YWx1ZSBuPSJtb2RlbGVyc1ZlcnNpb24iIHY9IjEwLjEzIi8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmlkZS5tb2RlbC5EZXBlbmRlbmN5Q29uZmlndXJhdGlvbiI+Ci0gICAgPGxpc3Qgbj0iZGVwZW5kZW5jeUxpc3QiLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLlJlc291cmNlUGF0aHMiPgotICAgIDxoYXNoIG49InJlc291cmNlc0NvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5jb21waWxlci5PamNDb25maWd1cmF0aW9uIj4KLSAgICA8dmFsdWUgbj0iaW50ZXJuYWxFbmNvZGluZyIgdj0iRGVmYXVsdCIvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyI+Ci0gICAgPHZhbHVlIG49ImoyZWVXZWJBcHBOYW1lIiB2PSJtYXZlbi1nZW5lcmF0ZWQtd2ViYXBwIi8+Ci0gICAgPHZhbHVlIG49ImoyZWVXZWJDb250ZXh0Um9vdCIgdj0ibWF2ZW4tZ2VuZXJhdGVkLWNvbnRleHQtcm9vdCIvPgotICAgIDxoYXNoIG49IndlYkNvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbiI+Ci0gICAgPGhhc2ggbj0iamF2YUNvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5vZmZsaW5lZGIubW9kZWwuT2ZmbGluZURCUHJvamVjdFNldHRpbmdzIj4KLSAgICA8aGFzaCBuPSJvZmZsaW5lREJDb250ZW50U2V0Ij4KLSAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+Ci0gICAgICAgIDxzdHJpbmcgdj0iKyoqIi8+Ci0gICAgICA8L2xpc3Q+Ci0gICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+Ci0gICAgICAgIDx1cmwgcGF0aD0iZGF0YWJhc2UvIi8+Ci0gICAgICA8L2xpc3Q+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLnJ1bm5lci5SdW5Db25maWd1cmF0aW9ucyI+Ci0gICAgPGhhc2ggbj0icnVuQ29uZmlndXJhdGlvbkRlZmluaXRpb25zIj4KLSAgICAgIDxoYXNoIG49IkRlZmF1bHQiPgotICAgICAgICA8dmFsdWUgbj0iY3VzdG9tIiB2PSJmYWxzZSIvPgotICAgICAgICA8dmFsdWUgbj0ibmFtZSIgdj0iRGVmYXVsdCIvPgotICAgICAgPC9oYXNoPgotICAgIDwvaGFzaD4KLSAgICA8bGlzdCBuPSJydW5Db25maWd1cmF0aW9uTGlzdCI+Ci0gICAgICA8c3RyaW5nIHY9IkRlZmF1bHQiLz4KLSAgICA8L2xpc3Q+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyI+Ci0gICAgPGxpc3Qgbj0iZXhwb3J0ZWRSZWZlcmVuY2VzIi8+Ci0gICAgPGhhc2ggbj0iaW50ZXJuYWxEZWZpbml0aW9ucyI+Ci0gICAgICA8bGlzdCBuPSJsaWJyYXJ5RGVmaW5pdGlvbnMiIC8+Ci0gICAgPC9oYXNoPgotICAgIDxsaXN0IG49ImxpYnJhcnlSZWZlcmVuY2VzIiAvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RQYXRocyI+Ci0gICAgPHVybCBuPSJvdXRwdXREaXJlY3RvcnkiIC8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLndlYmFwcC5qc3AubGlicmFyaWVzLm1vZGVsLlByb2plY3RUYWdMaWJyYXJpZXMiPgotICAgIDxoYXNoIG49ImxpYnJhcmllcyIvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS50b3BsaW5rLmFkZGluLlRvcExpbmtQcm9qZWN0U2V0dGluZ3MiPgotICAgIDxoYXNoIG49InRvcGxpbmtDb250ZW50U2V0Ij4KLSAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+Ci0gICAgICAgIDxzdHJpbmcgdj0iKyoqIi8+Ci0gICAgICA8L2xpc3Q+Ci0gICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+Ci0gICAgICAgIDx1cmwgcGF0aD0idG9wbGluay8iLz4KLSAgICAgIDwvbGlzdD4KLSAgICA8L2hhc2g+Ci0gIDwvaGFzaD4KLTwvanByOnByb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC93b3Jrc3BhY2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjQvd29ya3NwYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5NTM2NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC93b3Jrc3BhY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ1VURi04Jz8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGp3czp3b3Jrc3BhY2UgeG1sbnM6andzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+Ci0gICA8aGFzaCBuPSJjb21wb25lbnQtdmVyc2lvbnMiPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuNCIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC54bWwub2M0ai5kcy5EYXRhU291cmNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC40Ii8+Ci0gICA8L2hhc2g+Ci0gICA8bGlzdCBuPSJsaXN0T2ZDaGlsZHJlbiIgLz4KLTwvandzOndvcmtzcGFjZT4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMS4xLjEuMC4wL3Byb2plY3QueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzExLjEuMS4wLjAvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjc3ZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzExLjEuMS4wLjAvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ1VURi04Jz8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLQ0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqcHI6cHJvamVjdCB4bWxuczpqcHI9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4NCi0gICA8aGFzaCBuPSJjb21wb25lbnQtdmVyc2lvbnMiPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuYWRmYy5zb3VyY2UubWlncmF0aW9uLk1vdmVNZXRhZGF0YVJlc291cmNlc0FnYWluTWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLmpzZjIuZGlhZ3JhbS5taWdyYXRlLkpzZk5vZGVNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuc3RydXRzLmFkZGluLmRiLkFERlN0cnV0c1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLnN0cnV0cy5hZGRpbi5TdHJ1dHNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdGludGVybmFsLmR2dC5kYXRhcHJlc2R0Lm1pZ3JhdGlvbi5Kc3BQcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdGludGVybmFsLm1vZGVsLmlkZS5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wLjE7MTEuMS4xLjAuMC4xMSIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwubW9kZWwuaWRlLnhtbGVkLm1pZ3JhdGlvbi5BREZOb2RlTWlncmF0b3IiIHY9IjExLjEuMS4wLjAuNSIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwudmlldy5jb21tb24ubWlncmF0aW9uLndpemFyZHMuTWlncmF0aW9uSGVscGVyIiB2PSIxMS4xLjEuMC4wLjMiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdGludGVybmFsLnZpZXcucmljaC5iaW5kaW5nLm1pZ3JhdGlvbi5KYXJSZXNvdXJjZU1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYm0uY29tbW9uSWRlLlByb2plY3RVcGdyYWRlciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5ibS5taWdyYXRpb24ucHJvamVjdC5NaWdyYXRvclJlZ2lzdHJ5UHJvamVjdFVwZ3JhZGVBZGFwdGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuaWRlLm1vZGVsLlByb2plY3QiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRoc01pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpiby5kdC5qY2xpZW50Lm1pZ3JhdG9yLkpDUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpiby5kdC5qZGV2eC51aS5hcHBuYXYuQVBQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wLjUiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmVqYi5FamJNaWdyYXRvciIgdj0iMTAuMS4zLjQuMDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmVsb3Blci5saWJyYXJ5LlByb2plY3RMaWJyYXJ5TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLk91dHB1dERpcmVjdG9yeU1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwuZGVwbG95LkRlcGxveW1lbnRQcm9maWxlc01pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wLjEiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5kZXBsb3kuanBzLkpwc0RhdGFNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLmpzcC5Kc3BNaWdyYXRvciIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLmp1bml0LkpVbml0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAuMSIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLm9mZmxpbmVkYi5taWdyYXRpb24uT2ZmbGluZURCUHJvamVjdE1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lVHJhbnNmZXJNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnJlc291cmNlYnVuZGxlLlhsaWZmQWRkaW4kWGxpZmZNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnJ1bm5lci5SdW5Db25maWd1cmF0aW9uc01pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYmFwcC5qc3AubGlicmFyaWVzLkpzcExpYnJhcnlNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYmFwcC5XZWJBcHBOb2RlTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUubW9kZWxlci5ibW1pZ3JhdGUuZGlmLk1pZ3JhdGVUb0RJRiIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLnRpcC50b29scy5pZGUucG0uYWRkaW4ubWlncmF0b3IuUE1Qcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS50b3BsaW5rLmFkZGluLm1pZ3JhdGlvbi5Ub3BMaW5rUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLnRvcGxpbmsud29ya2JlbmNoLmFkZGluLm1pZ3JhdGlvbi5Ub3BMaW5rUHJvamVjdE1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUud2ViY2VudGVyLmludGVybmFsLmR0Lm1pZ3JhdGlvbi5XZWJDZW50ZXJQcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICA8L2hhc2g+DQotICAgPGxpc3Qgbj0iY29udGVudFNldHMiPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uL2phdmFDb250ZW50U2V0Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3Mvd2ViQ29udGVudFNldCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzL3Jlc291cmNlc0NvbnRlbnRTZXQiLz4NCi0gICAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5tb2RlbC5PZmZsaW5lREJQcm9qZWN0U2V0dGluZ3Mvb2ZmbGluZURCQ29udGVudFNldCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLnRpcC50b29scy5pZGUucG0uYWRkaW4uUE1Qcm9qZWN0U2V0dGluZ3MvSW50ZWdyYXRpb25fQ29udGVudCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmJtLmNvbW1vbklkZS5kYXRhLnByb2plY3QuTW9kZWxlclByb2plY3RTZXR0aW5ncy9tb2RlbGVyc0NvbnRlbnRTZXQiLz4NCi0gICAgICA8c3RyaW5nIHY9Im9yYWNsZS50b3BsaW5rLndvcmtiZW5jaC5hZGRpbi90b3BsaW5rQ29udGVudFNldCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLnRpcC50b29scy5pZGUuZmFicmljLmFkZGluLlNDQUNvbnRlbnRTZXRQcm92aWRlci9zY2EtY29udGVudCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwubW9kZWwuaWRlLnNldHRpbmdzLkFERk1TZXR0aW5ncy9hZGZtQ29udGVudFNldCIvPg0KLSAgIDwvbGlzdD4NCi0gICAgICA8aGFzaCBuPSJvcmFjbGUuYWRmZHRpbnRlcm5hbC5tb2RlbC5pZGUuc2V0dGluZ3MuQURGTVNldHRpbmdzIj4NCi0gICAgICA8aGFzaCBuPSJhZGZtQ29udGVudFNldCI+DQotICAgICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4NCi0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPg0KLSAgICAgICAgIDwvbGlzdD4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+DQotICAgICAgICAgICAgPHVybCBwYXRoPSJhZGZtc3JjLyIvPg0KLSAgICAgICAgIDwvbGlzdD4NCi0gICAgICA8L2hhc2g+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5ibS5jb21tb25JZGUuZGF0YS5wcm9qZWN0Lk1vZGVsZXJQcm9qZWN0U2V0dGluZ3MiPg0KLSAgICAgIDxoYXNoIG49Im1vZGVsZXJzQ29udGVudFNldCI+DQotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiPg0KLSAgICAgICAgICAgIDx1cmwgcGF0aD0ibW9kZWwvIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgIDwvaGFzaD4NCi0gICAgICA8dmFsdWUgbj0ibW9kZWxlcnNWZXJzaW9uIiB2PSIxMC4xMyIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIj4NCi0gICAgICA8bGlzdCBuPSJkZXBlbmRlbmN5TGlzdCIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLlJlc291cmNlUGF0aHMiPg0KLSAgICAgIDxoYXNoIG49InJlc291cmNlc0NvbnRlbnRTZXQiPg0KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+DQotICAgICAgICAgICAgPHN0cmluZyB2PSIrKioiLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiLz4NCi0gICAgICA8L2hhc2g+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmNvbXBpbGVyLk9qY0NvbmZpZ3VyYXRpb24iPg0KLSAgICAgIDx2YWx1ZSBuPSJhc3NlcnRpb25zRW5hYmxlZCIgdj0idHJ1ZSIvPg0KLSAgICAgIDx2YWx1ZSBuPSJjb21waWxlci5uYW1lIiB2PSJPamMiLz4NCi0gICAgICA8bGlzdCBuPSJjb3B5UmVzIj4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii5qYXZhIi8+DQotICAgICAgPC9saXN0Pg0KLSAgICAgIDx2YWx1ZSBuPSJpbnRlcm5hbEVuY29kaW5nIiB2PSJEZWZhdWx0Ii8+DQotICAgICAgPGxpc3Qgbj0iSmF2YWMuY29tbWFuZGxpbmUub3B0aW9ubGlzdCI+DQotICAgICAgICAgPHN0cmluZyB2PSItZyIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLVhsaW50OmFsbCIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLVhsaW50Oi1jYXN0Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LWVtcHR5Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LWZhbGx0aHJvdWdoIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LXBhdGgiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotc2VyaWFsIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LXVuY2hlY2tlZCIvPg0KLSAgICAgIDwvbGlzdD4NCi0gICAgICA8bGlzdCBuPSJPamMuY29tbWFuZGxpbmUub3B0aW9ubGlzdCI+DQotICAgICAgICAgPHN0cmluZyB2PSItZyIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLXdhcm4iLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46MzIwIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjM3MiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo0MTIiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NDEzIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjQxNSIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo0ODYiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NDg3Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjQ4OSIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo1NTYiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NTU4Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjU2MCIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo1NjEiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NzA1Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LWZhbGx0aHJvdWdoIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LXNlcmlhbCIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLVhsaW50Oi11bmNoZWNrZWQiLz4NCi0gICAgICA8L2xpc3Q+DQotICAgICAgPHZhbHVlIG49InJldmVyc2VDb3B5UmVzIiB2PSJ0cnVlIi8+DQotICAgICAgPHZhbHVlIG49InNob3dPYmplY3REb3RTdGF0aWNXYXJuaW5ncyIgdj0idHJ1ZSIvPg0KLSAgICAgIDx2YWx1ZSBuPSJzaG93UGFydGlhbEltcG9ydFdhcm5pbmdzIiB2PSJ0cnVlIi8+DQotICAgICAgPHZhbHVlIG49InNob3dVbnVzZWRJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiPg0KLSAgICAgIDx2YWx1ZSBuPSJqMmVlV2ViQXBwTmFtZSIgdj0ibWF2ZW4tZ2VuZXJhdGVkLXdlYmFwcCIvPg0KLSAgICAgIDx2YWx1ZSBuPSJqMmVlV2ViQ29udGV4dFJvb3QiIHY9Im1hdmVuLWdlbmVyYXRlZC1jb250ZXh0LXJvb3QiLz4NCi0gICAgICA8aGFzaCBuPSJ3ZWJDb250ZW50U2V0Ij4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCIgLz4NCi0gICAgICA8L2hhc2g+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbiI+DQotICAgICAgPGhhc2ggbj0iamF2YUNvbnRlbnRTZXQiPg0KLSAgICAgICAgPGxpc3Qgbj0iY29uc3RpdHVlbnQtc2V0cyIgLz4NCi0gICAgICA8L2hhc2g+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5tb2RlbC5PZmZsaW5lREJQcm9qZWN0U2V0dGluZ3MiPg0KLSAgICAgIDxoYXNoIG49Im9mZmxpbmVEQkNvbnRlbnRTZXQiPg0KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+DQotICAgICAgICAgICAgPHN0cmluZyB2PSIrKioiLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiPg0KLSAgICAgICAgICAgIDx1cmwgcGF0aD0iZGF0YWJhc2UvIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zIj4NCi0gICAgICA8aGFzaCBuPSJydW5Db25maWd1cmF0aW9uRGVmaW5pdGlvbnMiPg0KLSAgICAgICAgIDxoYXNoIG49IkRlZmF1bHQiPg0KLSAgICAgICAgICAgIDx2YWx1ZSBuPSJjb21waWxlQmVmb3JlUnVuIiB2PSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDx2YWx1ZSBuPSJjdXN0b20iIHY9ImZhbHNlIi8+DQotICAgICAgICAgICAgPHZhbHVlIG49Im5hbWUiIHY9IkRlZmF1bHQiLz4NCi0gICAgICAgICA8L2hhc2g+DQotICAgICAgPC9oYXNoPg0KLSAgICAgIDxsaXN0IG49InJ1bkNvbmZpZ3VyYXRpb25MaXN0Ij4NCi0gICAgICAgICA8c3RyaW5nIHY9IkRlZmF1bHQiLz4NCi0gICAgICA8L2xpc3Q+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RMaWJyYXJpZXMiPg0KLSAgICAgIDxsaXN0IG49ImV4cG9ydGVkUmVmZXJlbmNlcyIvPg0KLSAgICAgIDxoYXNoIG49ImludGVybmFsRGVmaW5pdGlvbnMiPg0KLSAgICAgICAgIDxsaXN0IG49ImxpYnJhcnlEZWZpbml0aW9ucyIgLz4NCi0gICAgICA8L2hhc2g+DQotICAgICAgPGxpc3Qgbj0ibGlicmFyeVJlZmVyZW5jZXMiLz4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdFBhdGhzIi8+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLndlYmFwcC5qc3AubGlicmFyaWVzLm1vZGVsLlByb2plY3RUYWdMaWJyYXJpZXMiPg0KLSAgICAgIDxsaXN0IG49InRhZy1saWJyYXJpZXMiLz4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLnRpcC50b29scy5pZGUuZmFicmljLmFkZGluLlNDQUNvbnRlbnRTZXRQcm92aWRlciI+DQotICAgICAgPGhhc2ggbj0ic2NhLWNvbnRlbnQiLz4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLnRpcC50b29scy5pZGUucG0uYWRkaW4uUE1Qcm9qZWN0U2V0dGluZ3MiPg0KLSAgICAgPGhhc2ggbj0iSW50ZWdyYXRpb25fQ29udGVudCI+DQotICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+DQotICAgICAgICAgPHN0cmluZyB2PSIrKioiLz4NCi0gICAgICAgPC9saXN0Pg0KLSAgICAgPC9oYXNoPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUudG9wbGluay53b3JrYmVuY2guYWRkaW4iPg0KLSAgICAgIDxoYXNoIG49InRvcGxpbmtDb250ZW50U2V0Ij4NCi0gICAgICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPg0KLSAgICAgICAgICAgIDxzdHJpbmcgdj0iKyoqIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIj4NCi0gICAgICAgICAgICA8dXJsIHBhdGg9InRvcGxpbmsvIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotPC9qcHI6cHJvamVjdD4NCi0NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC93b3Jrc3BhY2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzExLjEuMS4wLjAvd29ya3NwYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjYmVhZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC93b3Jrc3BhY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ1VURi04Jz8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLQ0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxqd3M6d29ya3NwYWNlIHhtbG5zOmp3cz0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vaWRlL3Byb2plY3QiPg0KLSAgIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+DQotICAgICAgPHZhbHVlIG49Im9yYWNsZS5hZGYuc2hhcmUuZHQubWlncmF0aW9uLmpwcy5KYXpuQ3JlZFN0b3JlTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwubW9kZWwuaWRlLnNlY3VyaXR5LndpemFyZC5BZGZTZWN1cml0eU1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5ydW5uZXIub2M0ai5FbWJlZGRlZFNlcnZlck1pZ3JhdG9ySGVscGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC54bWwub2M0ai5kcy5EYXRhU291cmNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC54bWwub2M0ai5qcHMuSnBzQ29uZmlnTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLm1kcy5pbnRlcm5hbC5kdC5pZGUubWlncmF0b3IuTURTQ29uZmlnTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLndlYmNlbnRlci5pbnRlcm5hbC5kdC5taWdyYXRpb24uV2ViQ2VudGVyV29ya3NwYWNlTWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICA8L2hhc2g+DQotICAgPGxpc3Qgbj0ibGlzdE9mQ2hpbGRyZW4iIC8+DQotPC9qd3M6d29ya3NwYWNlPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjhjYzguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLXBsdWdpbi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBQbHVnaW4gUGFyZW50PC9uYW1lPgotICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2luczwvdXJsPgotCi0gIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTVlGQUNFUzwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8Y2lNYW5hZ2VtZW50PgotICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgPG5vdGlmaWVycz4KLSAgICAgIDxub3RpZmllcj4KLSAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvbm90aWZpZXI+Ci0gICAgPC9ub3RpZmllcnM+Ci0gIDwvY2lNYW5hZ2VtZW50PgotCi0gIDxpbmNlcHRpb25ZZWFyPjIwMDE8L2luY2VwdGlvblllYXI+Ci0KLSAgPGJ1aWxkPgotICAgIDxyZXNvdXJjZXM+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3Jlc291cmNlPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotCi0gICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgPC9wbHVnaW5zPgotICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPCEtLQotICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkCi0gICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgLS0+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8IS0tCi0gICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgIC0tPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPjxnb2FsPmNoZWNrPC9nb2FsPjwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci1zcGFjZXMudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgPC9ydWxlc2V0cz4KLSAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1ub3JtYWwueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci1zcGFjZXMudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zLzwvdXJsPgotICA8L3NjbT4KLQotICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgIDxzaXRlPgotICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zPC91cmw+Ci0gICAgPC9zaXRlPgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgPHByb2ZpbGVzPgotICAgIDxwcm9maWxlPgotICAgICAgPGlkPnJlbGVhc2U8L2lkPgotICAgICAgPCEtLQotICAgICAgTk9URTogRXhlY3V0ZSB0aGlzIHByb2ZpbGUgbGlrZQotICAgICAgICAgICAgbXZuIGNsZWFuIHNvdXJjZTpqYXIgaW5zdGFsbCBkZXBsb3kgLURhbHREZXBsb3ltZW50UmVwb3NpdG9yeT1tYXR6ZXc6OmRlZmF1bHQ6OmZpbGU6Ly9GT0xERVIgLVByZWxlYXNlCi0gICAgICAgLS0+Ci0gICAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgotICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zY20tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPHBoYXNlPnZhbGlkYXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICA8aWQ+Z2V0dGluZy1zY20ucmV2aXNpb248L2lkPgotICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgIDxnb2FsPnVwZGF0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgPC9idWlsZD4KLSAgICA8L3Byb2ZpbGU+Ci0gIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3MzljMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy10YWdkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgVGFnIERvY3VtZW50YXRpb24gUmVwb3J0PC9uYW1lPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjc8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c2F4b248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYXhvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuNS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjYuMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi4wX3JjMi1kZXY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWZhY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29udGFpbmVyLWRlZmF1bHQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtODwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmRveGlhPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+ZG94aWEtc2l0ZS1yZW5kZXJlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS03PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMTI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NSZXBvcnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGE4OTA5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4udGFnZG9jOwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpbmsuU2luazsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5BYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZy5BYnN0cmFjdE1hdmVuTXVsdGlQYWdlUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nLk1hdmVuUmVwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nLnNpbmsuU2lua0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkV2ZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkV2ZW50UmVmQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG9uZW50RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db252ZXJ0ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlByb3BlcnR5RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5WYWxpZGF0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5kb3hpYS5zaW5rLlNpbms7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmRveGlhLnNpdGUucmVuZGVyZXIuU2l0ZVJlbmRlcmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlcG9ydCBmb3IgZ2VuZXJhdGluZyBKU0YgdGFnZG9jIGJhc2VkIG9uIGZhY2VzLWNvbmZpZy54bWwgcGFyc2luZy4KLSAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZWFsbHkgYW4gQWJzdHJhY3RNYXZlbk11bHRpUGFnZVJlcG9ydCAtIHRoZQotICogc2Vjb25kYXJ5IHBhZ2VzIGFyZSBtYW51YWxseSBnZW5lcmF0ZWQgWERvYy4gIEkgdHJpZWQgdXNpbmcgdGhlIHRydWUKLSAqIG11bHRpcGFnZSByZXBvcnQgYXBwcm9hY2gsIGFuZCByYW4gaW50byBNYXZlbiBidWdzIChhcyBvZiBNYXZlbiAyLjAuMiwKLSAqIHNpdGUgMi4wYjQpLgotICoKLSAqIEBnb2FsIHRhZ2RvYwotICovCi1wdWJsaWMgY2xhc3MgVGFnZG9jUmVwb3J0IGV4dGVuZHMgQWJzdHJhY3RNYXZlbk11bHRpUGFnZVJlcG9ydAotewotICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlUmVwb3J0KCBMb2NhbGUgbG9jYWxlICkKLSAgICAgIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gV2h5IHRoZSBoZWNrIGRvZXNuJ3QgTWF2ZW4gZG8gdGhpcyBmb3IgbWU/Ci0gICAgU2lua0ZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaW5rRmFjdG9yeSgpOwotICAgIGZhY3Rvcnkuc2V0U2l0ZVJlbmRlcmVyKGdldFNpdGVSZW5kZXJlcigpKTsKLSAgICBmYWN0b3J5LnNldFNpdGVEaXJlY3RvcnkoZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOwotICAgIHNldFNpbmtGYWN0b3J5KGZhY3RvcnkpOwotICAgIAotICAgIHByb2Nlc3NJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIF9nZW5lcmF0ZVRhZ0RvY3MoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiQ291bGRuJ3QgZ2VuZXJhdGUgdGFnZG9jIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVRhZ0RvY3MoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgIGlmICghZmFjZXNDb25maWcuaGFzQ29tcG9uZW50cygpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBubyBjb21wb25lbnRzIGZvdW5kIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBJdGVyYXRvciBjb21wb25lbnRzID0gZmFjZXNDb25maWcuY29tcG9uZW50cygpOwotICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgU2tpcEZpbHRlcigpKTsKLSAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudFRhZ0ZpbHRlcigpKTsKLSAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudE5hbWVzcGFjZUZpbHRlcigpKTsKLSAgICAKLSAgICBJdGVyYXRvciB2YWxpZGF0b3JzID0gZmFjZXNDb25maWcudmFsaWRhdG9ycygpOwotICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yVGFnRmlsdGVyKCkpOwotICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGNvbnZlcnRlcnMgPSBmYWNlc0NvbmZpZy5jb252ZXJ0ZXJzKCk7Ci0gICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJUYWdGaWx0ZXIoKSk7Ci0gICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJOYW1lc3BhY2VGaWx0ZXIoKSk7Ci0gICAgCi0gICAgLy8gPS09QUVXIE5vdGUgdGhhdCBvbmx5IHVwZGF0aW5nIG91dC1vZi1kYXRlIGNvbXBvbmVudHMsIGV0Yy4gaXMKLSAgICAvLyBwZXJtYW5lbnRseSB0cmlja3ksIGV2ZW4gaWYgd2UgaGFkIHByb3BlciBkZXRlY3Rpb24gaW4gcGxhY2UsCi0gICAgLy8gYmVjYXVzZSB0aGUgaW5kZXggYWx3YXlzIGhhcyB0byBoYXZlIGFsbCBkb2NzCi0gICAgLyoKLSAgICBpZiAoIWNvbXBvbmVudHMuaGFzTmV4dCgpICYmICFjb252ZXJ0ZXJzLmhhc05leHQoKSAmJiAhdmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIGFsbCBkb2NzIGFyZSB1cCB0byBkYXRlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICovCi0KLSAgICBTZXQgY29tcG9uZW50UGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgIFNldCBjb252ZXJ0ZXJQYWdlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgU2V0IHZhbGlkYXRvclBhZ2VzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAKLSAgICBpbnQgY291bnQgPSAwOwotICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb21wb25lbnREb2MoKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudFBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoKENvbnZlcnRlckJlYW4pY29udmVydGVycy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbnZlcnRlclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVWYWxpZGF0b3JEb2MoKFZhbGlkYXRvckJlYW4pdmFsaWRhdG9ycy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRvclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBTZXQgb3RoZXJQYWdlcyA9IF9nYXRoZXJPdGhlclRhZ3MoKTsKLQotICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgY291bnQgKyAiIHBhZ2UocykiKTsKLQotICAgIFNpbmsgc2luayA9IGdldFNpbmsoKTsKLSAgICBzaW5rLmhlYWQoKTsKLSAgICBzaW5rLnRpdGxlKCk7Ci0gICAgc2luay50ZXh0KCJUYWcgbGlicmFyeSBkb2N1bWVudGF0aW9uIik7Ci0gICAgc2luay50aXRsZV8oKTsgICAgCi0gICAgc2luay5oZWFkXygpOwotICAgIHNpbmsuYm9keSgpOwotCi0gICAgc2luay5zZWN0aW9uVGl0bGUxKCk7Ci0gICAgc2luay50ZXh0KCJUYWcgbGlicmFyeSBpbmZvcm1hdGlvbiIpOwotICAgIHNpbmsuc2VjdGlvblRpdGxlMV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgc2luay5wYXJhZ3JhcGgoKTsKLQotICAgICAgc2luay5ib2xkKCk7Ci0gICAgICBzaW5rLnRleHQoIlNob3J0IG5hbWU6Iik7Ci0gICAgICBzaW5rLmJvbGRfKCk7Ci0gICAgICBzaW5rLm5vbkJyZWFraW5nU3BhY2UoKTsKLSAgICAgIHNpbmsudGV4dChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgIHNpbmsubGluZUJyZWFrKCk7Ci0KLSAgICAgIHNpbmsuYm9sZCgpOwotICAgICAgc2luay50ZXh0KCJOYW1lc3BhY2U6Iik7Ci0gICAgICBzaW5rLmJvbGRfKCk7Ci0gICAgICBzaW5rLm5vbkJyZWFraW5nU3BhY2UoKTsKLSAgICAgIHNpbmsudGV4dChlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgICAgc2luay5saW5lQnJlYWsoKTsKLQotICAgICAgc2luay5wYXJhZ3JhcGhfKCk7Ci0gICAgfQotCi0gICAgc2luay5zZWN0aW9uMV8oKTsKLQotICAgIF93cml0ZUluZGV4U2VjdGlvbihzaW5rLCBjb21wb25lbnRQYWdlcywgIkNvbXBvbmVudHMiKTsKLSAgICBfd3JpdGVJbmRleFNlY3Rpb24oc2luaywgY29udmVydGVyUGFnZXMsICJDb252ZXJ0ZXJzIik7Ci0gICAgX3dyaXRlSW5kZXhTZWN0aW9uKHNpbmssIHZhbGlkYXRvclBhZ2VzLCAiVmFsaWRhdG9ycyIpOwotICAgIF93cml0ZUluZGV4U2VjdGlvbihzaW5rLCBvdGhlclBhZ2VzLCAiTWlzY2VsbGFuZW91cyIpOwotCi0gICAgc2luay5ib2R5XygpOwotICB9Ci0KLSAgcHJpdmF0ZSBTZXQgX2dhdGhlck90aGVyVGFncygpCi0gIHsKLSAgICBUcmVlU2V0IHNldCA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgU3RyaW5nIHN1YkRpciA9IAotICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgieGRvYy8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgRmlsZSBzaXRlU3ViRGlyID0gbmV3IEZpbGUoc2l0ZURpcmVjdG9yeSwgc3ViRGlyKTsKLSAgICBpZiAoc2l0ZVN1YkRpci5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBmaWxlcyA9IHNpdGVTdWJEaXIubGlzdCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsKLSAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoIi54bWwiKSkKLSAgICAgICAgewotICAgICAgICAgIHNldC5hZGQoZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGgoKSAtIDQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzZXQ7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZm9ybWF0UHJvcExpc3QoCi0gICAgU3RyaW5nW10gcExpc3QsIAotICAgIFN0cmluZyAgIGhlYWRlcikKLSAgewotICAgIFN0cmluZ1tdIG51bGxMaXN0ID0ge307Ci0gICAgcmV0dXJuIF9mb3JtYXRQcm9wTGlzdChwTGlzdCwgaGVhZGVyLCBudWxsTGlzdCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZm9ybWF0UHJvcExpc3QoCi0gICAgU3RyaW5nW10gcExpc3QsIAotICAgIFN0cmluZyAgIGhlYWRlciwKLSAgICBTdHJpbmdbXSBpZ25vcmVzKQotICB7Ci0gICAgU3RyaW5nIGZvcm1hdHRlZCA9IG51bGw7Ci0gICAgaWYgKChwTGlzdCAhPSBudWxsKSAmJiAocExpc3QubGVuZ3RoID4gMCkpCi0gICAgewotICAgICAgLy8gRG9uJ3Qga25vdyBob3cgbG9uZyB0aGlzIHdpbGwgYmUsIGJ1dCAxMDAgc2hvdWxkIGJlIHBsZW50eS4KLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLSAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgIHNiLmFwcGVuZCgiPGI+Iik7Ci0gICAgICBzYi5hcHBlbmQoaGVhZGVyKTsKLSAgICAgIHNiLmFwcGVuZCgiOjwvYj4gIik7Ci0KLSAgICAgIGJvb2xlYW4gZ290T25lID0gZmFsc2U7Ci0KLSAgICAgIGZvciAoaW50IGFyckluZCA9IDA7IGFyckluZCA8IHBMaXN0Lmxlbmd0aDsgYXJySW5kKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJTdHIgPSBwTGlzdFthcnJJbmRdOwotICAgICAgICBvdXRlcjoKLSAgICAgICAgaWYgKGN1clN0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZ25vcmVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gaWdub3Jlc1tpXTsKLSAgICAgICAgICAgIGlmICgocyAhPSBudWxsKSAmJiAocy5lcXVhbHNJZ25vcmVDYXNlKGN1clN0cikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhayBvdXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZ290T25lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ290T25lID0gdHJ1ZTsKLSAgICAgICAgICBzYi5hcHBlbmQoY3VyU3RyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGdvdE9uZSkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8YnIvPlxuIik7Ci0gICAgICAgIGZvcm1hdHRlZCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtYXR0ZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlSW5kZXhTZWN0aW9uKFNpbmsgc2luaywgU2V0IHBhZ2VzLCBTdHJpbmcgdGl0bGUpCi0gIHsKLSAgICBpZiAocGFnZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaW5rLnNlY3Rpb25UaXRsZTEoKTsKLSAgICBzaW5rLnRleHQodGl0bGUpOwotICAgIHNpbmsuc2VjdGlvblRpdGxlMV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xKCk7Ci0gICAgc2luay50YWJsZSgpOwotICAgIHNpbmsudGFibGVSb3coKTsKLSAgICBzaW5rLnRhYmxlSGVhZGVyQ2VsbCgpOwotICAgIHNpbmsudGV4dCgiVGFnIE5hbWUiKTsKLSAgICBzaW5rLnRhYmxlSGVhZGVyQ2VsbF8oKTsKLSAgICBzaW5rLnRhYmxlUm93XygpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBzaW5rLnRhYmxlUm93KCk7Ci0gICAgICBzaW5rLnRhYmxlQ2VsbCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgU3RyaW5nIHRhZ05hbWUgPSAiPCIgKyBuYW1lLnJlcGxhY2UoJ18nLCAnOicpICsgIj4iOwotICAgICAgCi0gICAgICBzaW5rLmxpbmsoX0RPQ19TVUJESVJFQ1RPUlkgKyAiLyIgKyBuYW1lICsgIi5odG1sIik7Ci0gICAgICBzaW5rLnRleHQodGFnTmFtZSk7Ci0gICAgICBzaW5rLmxpbmtfKCk7Ci0gICAgICAKLSAgICAgIHNpbmsudGFibGVDZWxsXygpOwotICAgICAgc2luay50YWJsZVJvd18oKTsKLSAgICB9Ci0gICAgCi0gICAgc2luay50YWJsZV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xXygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdXNlUGFnZUxpbmtCYXIoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX3RvUGFnZU5hbWUoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICByZXR1cm4gX2dldFByZWZpeChxTmFtZSkgKyAiXyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgX2dldFF1YWxpZmllZE5hbWUoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICByZXR1cm4gX2dldFByZWZpeChxTmFtZSkgKyAiOiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9nZXRQcmVmaXgoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICBpZiAoKHFOYW1lLmdldFByZWZpeCgpICE9IG51bGwpICYmICEiIi5lcXVhbHMocU5hbWUuZ2V0UHJlZml4KCkpKQotICAgIHsKLSAgICAgIHJldHVybiBxTmFtZS5nZXRQcmVmaXgoKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gInVua25vd24iOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlQ29tcG9uZW50RG9jKENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGlmIChjb21wb25lbnQuZ2V0VGFnTmFtZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIFN0cmluZyBwYWdlTmFtZSA9IF90b1BhZ2VOYW1lKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkpOwotCi0gICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgiZ2VuZXJhdGVkLXNpdGUveGRvYy8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLQotICAgIFdyaXRlciBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIjxkb2N1bWVudD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPHByb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiICA8dGl0bGU+Jmx0OyIgKyBfZ2V0UXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFnTmFtZSgpKSArICImZ3Q7PC90aXRsZT5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9wcm9wZXJ0aWVzPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8Ym9keT5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiU3VtbWFyeVwiPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cD5cbiIpOwotICAgICAgX3dyaXRlQ29tcG9uZW50U3VtbWFyeShvdXQsIGNvbXBvbmVudCk7Ci0gICAgICBvdXQud3JpdGUoIiA8L3A+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgCi0gICAgICBpZiAoY29tcG9uZW50Lmhhc0V2ZW50cyh0cnVlKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LndyaXRlKCIgPHNlY3Rpb24gbmFtZT1cIkV2ZW50c1wiPlxuIik7Ci0gICAgICAgIG91dC53cml0ZSgiIDxwPlxuIik7Ci0gICAgICAgIF93cml0ZUNvbXBvbmVudEV2ZW50cyhvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIG91dC53cml0ZSgiIDwvcD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIiA8L3NlY3Rpb24+XG4iKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGNvbXBvbmVudC5oYXNGYWNldHModHJ1ZSkpCi0gICAgICB7Ci0gICAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJTdXBwb3J0ZWQgRmFjZXRzXCI+XG4iKTsKLSAgICAgICAgb3V0LndyaXRlKCIgPHA+XG4iKTsKLSAgICAgICAgX3dyaXRlQ29tcG9uZW50RmFjZXRzKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgb3V0LndyaXRlKCIgPC9wPlxuIik7Ci0gICAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgfQotICAgICAgCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiQXR0cmlidXRlc1wiPlxuIik7Ci0gICAgICBfd3JpdGVDb21wb25lbnRBdHRyaWJ1dGVzKG91dCwgY29tcG9uZW50KTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8L2JvZHk+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC9kb2N1bWVudD5cbiIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhZ2VOYW1lOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGNvbnZlcnRlci5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZShjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpKTsKLQotICAgIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoImdlbmVyYXRlZC1zaXRlL3hkb2MvIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLQotICAgIFdyaXRlciBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIjxkb2N1bWVudD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPHByb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiICA8dGl0bGU+Jmx0OyIgKyBfZ2V0UXVhbGlmaWVkTmFtZShjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpKSArICImZ3Q7PC90aXRsZT5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9wcm9wZXJ0aWVzPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8Ym9keT5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiU3VtbWFyeVwiPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cD5cbiIpOwotICAgICAgX3dyaXRlQ29udmVydGVyU3VtbWFyeShvdXQsIGNvbnZlcnRlcik7Ci0gICAgICBvdXQud3JpdGUoIiA8L3A+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgICAgICAgCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiQXR0cmlidXRlc1wiPlxuIik7Ci0gICAgICBfd3JpdGVDb252ZXJ0ZXJBdHRyaWJ1dGVzKG91dCwgY29udmVydGVyKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8L2JvZHk+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC9kb2N1bWVudD5cbiIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhZ2VOYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlVmFsaWRhdG9yRG9jKFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICh2YWxpZGF0b3IuZ2V0VGFnTmFtZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgU3RyaW5nIHBhZ2VOYW1lID0gX3RvUGFnZU5hbWUodmFsaWRhdG9yLmdldFRhZ05hbWUoKSk7Ci0KLSAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKCJnZW5lcmF0ZWQtc2l0ZS94ZG9jLyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgdGFyZ2V0RGlyLm1rZGlycygpOwotICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgcGFnZU5hbWUgKyAiLnhtbCIpOwotCi0gICAgV3JpdGVyIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgb3V0LndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPGRvY3VtZW50PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cHJvcGVydGllcz5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgIDx0aXRsZT4mbHQ7IiArIF9nZXRRdWFsaWZpZWROYW1lKHZhbGlkYXRvci5nZXRUYWdOYW1lKCkpICsgIiZndDs8L3RpdGxlPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8L3Byb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDxib2R5PlxuIik7Ci0KLSAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJTdW1tYXJ5XCI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDxwPlxuIik7Ci0gICAgICBfd3JpdGVWYWxpZGF0b3JTdW1tYXJ5KG91dCwgdmFsaWRhdG9yKTsKLSAgICAgIG91dC53cml0ZSgiIDwvcD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9zZWN0aW9uPlxuIik7Ci0gICAgICAgICAgICAKLSAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJBdHRyaWJ1dGVzXCI+XG4iKTsKLSAgICAgIF93cml0ZVZhbGlkYXRvckF0dHJpYnV0ZXMob3V0LCB2YWxpZGF0b3IpOwotICAgICAgb3V0LndyaXRlKCIgPC9zZWN0aW9uPlxuIik7Ci0KLSAgICAgIG91dC53cml0ZSgiIDwvYm9keT5cbiIpOwotICAgICAgb3V0LndyaXRlKCI8L2RvY3VtZW50PlxuIik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGFnZU5hbWU7Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb21wb25lbnRTdW1tYXJ5KFdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQud3JpdGUoIiAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyIgKwotICAgICAgICAgICAgICBfZ2V0UXVhbGlmaWVkTmFtZShiZWFuLmdldFRhZ05hbWUoKSkgKyAiJmd0O1xuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgCi0KLSAgICBvdXQud3JpdGUoIiAgIDxiPlVJQ29tcG9uZW50IGNsYXNzOjwvYj4gIik7Ci0gICAgU3RyaW5nIGphdmFkb2NVUkwgPSBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoIi4uL2FwaWRvY3MvIiArCi0gICAgICBiZWFuLmdldENvbXBvbmVudENsYXNzKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmh0bWwiKTsKLSAgICBvdXQud3JpdGUoIjxhIGhyZWY9XCIiICsgamF2YWRvY1VSTCArICJcIj4iKTsKLQotICAgIG91dC53cml0ZShiZWFuLmdldENvbXBvbmVudENsYXNzKCkpOwotICAgIG91dC53cml0ZSgiPC9hPiIpOwotICAgIG91dC53cml0ZSgiXG4iKTsKLSAgICBvdXQud3JpdGUoIiAgIDxici8+XG4iKTsKLSAgICBvdXQud3JpdGUoIiAgIDxiPkNvbXBvbmVudCB0eXBlOjwvYj4gIiArIGJlYW4uZ2V0Q29tcG9uZW50VHlwZSgpICsgICJcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotCi0gICAgaWYgKF9pc05hbWluZ0NvbnRhaW5lcihiZWFuKSkKLSAgICB7Ci0gICAgICBvdXQud3JpdGUoIiAgIDxwPjxiPk5hbWluZyBjb250YWluZXI6PC9iPiAgWWVzLiAgV2hlbiByZWZlcnJpbmcgdG8gY2hpbGRyZW4gb2YgdGhpcyAiICsKLSAgICAgICAgICAgICAgICAiY29tcG9uZW50IChcInBhcnRpYWxUcmlnZ2Vyc1wiLCA8Y29kZT5maW5kQ29tcG9uZW50KCk8L2NvZGU+LCBldGMuKSwgIiArCi0gICAgICAgICAgICAgICAgInlvdSBtdXN0IHByZWZpeCB0aGUgY2hpbGQncyBJRCB3aXRoIHRoaXMgY29tcG9uZW50J3MgSUQgYW5kIGEgY29sb24gKCc6JykuPC9wPiIpOwotICAgIH0KLSAgICAgIAotICAgIFN0cmluZyBmbXRkID0gX2Zvcm1hdFByb3BMaXN0KGJlYW4uZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgYWdlbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTk9OX0RPQ1VNRU5URURfQUdFTlRTKTsKLSAgICBpZiAoZm10ZCAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiICAgIiArIGZtdGQpOwotICAgIH0KLQotICAgIFN0cmluZyBkb2MgPSBiZWFuLmdldExvbmdEZXNjcmlwdGlvbigpOwotICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2MgPSBiZWFuLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgb3V0LndyaXRlKF9wcmVUb1NvdXJjZShkb2MpKTsKLSAgICBvdXQud3JpdGUoIlxuIik7Ci0gIH0KLQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXNOYW1pbmdDb250YWluZXIoQ29tcG9uZW50QmVhbiBiZWFuKQotICB7Ci0gICAgaWYgKGJlYW4uaXNOYW1pbmdDb250YWluZXIoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGJlYW4ucmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBfaXNOYW1pbmdDb250YWluZXIocGFyZW50KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVWYWxpZGF0b3JTdW1tYXJ5KFdyaXRlciBvdXQsIFZhbGlkYXRvckJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQud3JpdGUoIiAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyIgKwotICAgICAgICAgICAgICBfZ2V0UXVhbGlmaWVkTmFtZShiZWFuLmdldFRhZ05hbWUoKSkgKyAiJmd0O1xuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgCi0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8Yj4gdHlwZTo8L2I+ICIgKyBiZWFuLmdldFZhbGlkYXRvcklkKCkgKyAgIlxuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0KLSAgICBTdHJpbmcgZG9jID0gYmVhbi5nZXRMb25nRGVzY3JpcHRpb24oKTsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgewotICAgICAgZG9jID0gYmVhbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIG91dC53cml0ZShfcHJlVG9Tb3VyY2UoZG9jKSk7Ci0gICAgb3V0LndyaXRlKCJcbiIpOwotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29udmVydGVyU3VtbWFyeShXcml0ZXIgb3V0LCBDb252ZXJ0ZXJCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LndyaXRlKCIgICA8Yj5UYWcgbmFtZTo8L2I+ICZsdDsiICsKLSAgICAgICAgICAgICAgX2dldFF1YWxpZmllZE5hbWUoYmVhbi5nZXRUYWdOYW1lKCkpICsgIiZndDtcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotICAgIAotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotICAgIG91dC53cml0ZSgiICAgPGI+IHR5cGU6PC9iPiAiICsgYmVhbi5nZXRDb252ZXJ0ZXJJZCgpICsgICJcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotCi0gICAgU3RyaW5nIGRvYyA9IGJlYW4uZ2V0TG9uZ0Rlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGRvYyA9PSBudWxsKQotICAgIHsKLSAgICAgIGRvYyA9IGJlYW4uZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBvdXQud3JpdGUoX3ByZVRvU291cmNlKGRvYykpOwotICAgIG91dC53cml0ZSgiXG4iKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfcHJlVG9Tb3VyY2UoU3RyaW5nIGluKQotICB7Ci0gICAgaW4gPSBpbi5yZXBsYWNlQWxsKCI8cHJlPiIsICI8c291cmNlPjwhW0NEQVRBWyIpOwotICAgIGluID0gaW4ucmVwbGFjZUFsbCgiPC9wcmU+IiwgIl1dPjwvc291cmNlPiIpOwotICAgIGluID0gaW4ucmVwbGFjZUFsbCgiPGh0bWw6IiwgIjwiKTsKLSAgICBpbiA9IGluLnJlcGxhY2VBbGwoIjwvaHRtbDoiLCAiPC8iKTsKLQotICAgIHJldHVybiBpbjsKLSAgfQotICAKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wbGF0Zm9ybUFnbm9zdGljUGF0aChTdHJpbmcgcGF0aCkKLSAgewotICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gIH0KLQotCi0gIHByaXZhdGUgY2xhc3MgR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcgotICB7Ci0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICAgIHsKLSAgICAgIHJldHVybiBfZ2V0R3JvdXBJbmRleChvMSkgLSBfZ2V0R3JvdXBJbmRleChvMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiAobyBpbnN0YW5jZW9mIEdyb3VwQ29tcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgLy8gWWVzLCB0aGlzIGlzIGEgdmVyeSBzdHJhbmdlIGhhc2hDb2RlIGltcGxlbWVudGF0aW9uLiBCdXQgdGhlCi0gICAgICAvLyBlcXVhbHMgbWV0aG9kIGlzIGFsc28gdmVyeSBzdHJhbmdlOyBhbnkgdHdvIEdyb3VwQ29tcGFyYXRvcgotICAgICAgLy8gb2JqZWN0cyBhcmUgYWx3YXlzIGVxdWFsLiBUaGVyZWZvcmUgYnkgdGhlIGphdmEgcnVsZXMsIGFueQotICAgICAgLy8gdHdvIEdyb3VwQ29tcGFyYXRvciBvYmplY3RzIG11c3QgYWx3YXlzIGhhdmUgdGhlIHNhbWUgaGFzaENvZGUuCi0gICAgICByZXR1cm4gMTc7ICAvLyBhbiBhcmJpdHJhcnkgY29uc3RhbnQuCi0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgX2dldEdyb3VwSW5kZXgoT2JqZWN0IG8pCi0gICAgewotICAgICAgU3RyaW5nIHMgPSAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0KLQotCi0KLSAgICAgIGlmICgibWVzc2FnZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgiY29yZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoImV2ZW50cyIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIlVOS05PV04gQVRUUklCVVRFIEdST1VQOiAiICsgcyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMoV3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBiZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFNvcnQgdGhlIG5hbWVzCi0gICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBhdHRycyA9IGJlYW4ucHJvcGVydGllcyh0cnVlKTsKLSAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGF0dHJzLm5leHQoKTsKLSAgICAgIGlmICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVzLmFkZChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlCZWFucwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGJlYW4uZmluZFByb3BlcnR5KGF0dHJOYW1lLCB0cnVlKSk7Ci0gICAgfQotICAgIAotCi0gICAgVHJlZVNldCBncm91cHMgPSBuZXcgVHJlZVNldChuZXcgR3JvdXBDb21wYXJhdG9yKCkpOwotICAgIC8qIE5vIGN1cnJlbnQgc3VwcG9ydCBmb3IgZ3JvdXBpbmcKLSAgICAvLyBNYWtlIHN1cmUgIm51bGwiIGlzIHRoZSByZXByZXNlbnRhdGl2ZSBmb3IgdW5rbm93biBncm91cHMKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZ3JvdXAgPSAoKEF0dHJpYnV0ZURvYykgaXRlci5uZXh0KCkpLmdyb3VwOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdyb3Vwcy5hZGQoZ3JvdXApOwotICAgICAgfQotICAgIH0KLSAgICAqLwotCi0gICAgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldENvbXBvbmVudENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMuaXNFbXB0eSgpID8gbnVsbCA6ICJVbmdyb3VwZWQiKTsKLQotICAgIEl0ZXJhdG9yIGdyb3VwSXRlciA9IGdyb3Vwcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChncm91cEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q29tcG9uZW50Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZ3JvdXBJdGVyLm5leHQoKSk7Ci0gICAgfQotCi0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb252ZXJ0ZXJBdHRyaWJ1dGVzKFdyaXRlciBvdXQsIENvbnZlcnRlckJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTb3J0IHRoZSBuYW1lcwotICAgIFRyZWVTZXQgYXR0cmlidXRlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgSXRlcmF0b3IgYXR0cnMgPSBiZWFuLnByb3BlcnRpZXMoKTsKLSAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGF0dHJzLm5leHQoKTsKLSAgICAgIGlmICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVzLmFkZChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlCZWFucwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGJlYW4uZmluZFByb3BlcnR5KGF0dHJOYW1lKSk7Ci0gICAgfQotICAgIAotICAgIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5pdGVyYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDb252ZXJ0ZXJDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gIH0KLQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVZhbGlkYXRvckF0dHJpYnV0ZXMoV3JpdGVyIG91dCwgVmFsaWRhdG9yQmVhbiBiZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFNvcnQgdGhlIG5hbWVzCi0gICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBhdHRycyA9IGJlYW4ucHJvcGVydGllcygpOwotICAgIHdoaWxlIChhdHRycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgYXR0cnMubmV4dCgpOwotICAgICAgaWYgKCFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgICB7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgZ2V0IGEgbGlzdCBvZiBQcm9wZXJ0eUJlYW5zCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgbGlzdC5hZGQoYmVhbi5maW5kUHJvcGVydHkoYXR0ck5hbWUpKTsKLSAgICB9Ci0gICAgCi0gICAgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldFZhbGlkYXRvckNsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgfQotCi0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiB3cml0dGVuQW55QXR0cmlidXRlcyA9IGZhbHNlOwotCi0gICAgd2hpbGUgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBhdHRyID0gKFByb3BlcnR5QmVhbikgYXR0cmlidXRlcy5uZXh0KCk7Ci0KLSAgICAgIC8qCi0gICAgICBpZiAoKGdyb3VwID09IG51bGwpIHx8ICJVbmdyb3VwZWQiLmVxdWFscyhncm91cCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChkb2MuZ3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFncm91cC5lcXVhbHNJZ25vcmVDYXNlKGRvYy5ncm91cCkpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAqLwotCi0gICAgICBpZiAoIXdyaXR0ZW5BbnlBdHRyaWJ1dGVzKQotICAgICAgewotICAgICAgICB3cml0dGVuQW55QXR0cmlidXRlcyA9IHRydWU7Ci0gICAgICAgIGlmIChncm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lOwotICAgICAgICAgIGlmICgiZXZlbnRzIi5lcXVhbHNJZ25vcmVDYXNlKGdyb3VwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWN0aW9uTmFtZSA9ICJKYXZhc2NyaXB0IGF0dHJpYnV0ZXMiOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VjdGlvbk5hbWUgPSBncm91cCArICIgYXR0cmlidXRlcyI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgb3V0LndyaXRlKCI8c3Vic2VjdGlvbiBuYW1lPVwiIiArIHNlY3Rpb25OYW1lICsgIlwiPlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQud3JpdGUoIjx0YWJsZT5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5OYW1lPC90aD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5UeXBlPC90aD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5TdXBwb3J0cyBFTD88L3RoPlxuIik7Ci0gICAgICAgIGlmICghX2F0dHJEb2NTcGFuc0NvbHVtbnMpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQud3JpdGUoIjx0aD5EZXNjcmlwdGlvbjwvdGg+XG4iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoIjwvdHI+XG4iKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGF0dHIuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICAvLyBRdWljayBmaXggb2YgcHJvYmxlbXMgd2l0aCBhY3Rpb25FeHByZXNzaW9uIHZzLiBhY3Rpb24KLSAgICAgIC8vIGFjdGlvbkV4cHJlc3Npb24gaXMgdGhlIE1ldGhvZEV4cHJlc3Npb24gb24gdGhlIGNvbXBvbmVudCwKLSAgICAgIC8vIGJ1dCBvbiB0aGUgdGFnIGl0J3MgJ2FjdGlvbicKLSAgICAgIGlmICgiYWN0aW9uRXhwcmVzc2lvbiIuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9ICJhY3Rpb24iOwotICAgICAgfQotCi0gICAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgICAgb3V0LndyaXRlKCI8dGQ+IiArIHByb3BlcnR5TmFtZSArICI8L3RkPiIpOwotICAgICAgU3RyaW5nIHR5cGUgPSBfZ2V0RGlzcGxheVR5cGUoY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRQcm9wZXJ0eUNsYXNzKCkpOwotCi0gICAgICBvdXQud3JpdGUoIjx0ZD4iICsgdHlwZSArICI8L3RkPiIpOwotCi0gICAgICBTdHJpbmcgZWxTdXBwb3J0ZWQ7Ci0gICAgICAvLyBNZXRob2RCaW5kaW5ncywgImJpbmRpbmciLCBhbmQgc29tZSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICAvLyByZXF1aXJlIEVMIHN1cHBvcnQKLSAgICAgIGlmIChhdHRyLmlzTWV0aG9kQmluZGluZygpIHx8IAotICAgICAgICAgIGF0dHIuaXNNZXRob2RFeHByZXNzaW9uKCkgfHwKLSAgICAgICAgICAiYmluZGluZyIuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICB7Ci0gICAgICAgIC8vICJhY3Rpb24iIGRvZXNuJ3QgcmVxdWlyZSBFTDsgYWxsIGVsc2UgZG8uCi0gICAgICAgIGVsU3VwcG9ydGVkID0gImFjdGlvbiIuZXF1YWxzKHByb3BlcnR5TmFtZSkgPyAiWWVzIiA6ICJPbmx5IEVMIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWxTdXBwb3J0ZWQgPSBhdHRyLmlzTGl0ZXJhbE9ubHkoKSA/ICJObyIgOiAiWWVzIjsKLSAgICAgIH0KLQotICAgICAgb3V0LndyaXRlKCI8dGQ+IiArIGVsU3VwcG9ydGVkICsgIjwvdGQ+Iik7Ci0KLSAgICAgIGlmIChhdHRyLmdldERlc2NyaXB0aW9uKCkgICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWxTdHIgPSBfZm9ybWF0UHJvcExpc3QoYXR0ci5nZXRQcm9wZXJ0eVZhbHVlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWxpZCBWYWx1ZXMiKTsKLSAgICAgICAgU3RyaW5nIHVuc3VwQWdlbnRzU3RyID0KLSAgICAgICAgICBfZm9ybWF0UHJvcExpc3QoYXR0ci5nZXRVbnN1cHBvcnRlZEFnZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCBvbiB0aGUgZm9sbG93aW5nIGFnZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9OT05fRE9DVU1FTlRFRF9BR0VOVFMpOwotICAgICAgICBTdHJpbmcgdW5zdXBSa1N0ciA9Ci0gICAgICAgICAgX2Zvcm1hdFByb3BMaXN0KGF0dHIuZ2V0VW5zdXBwb3J0ZWRSZW5kZXJLaXRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJOb3Qgc3VwcG9ydGVkIG9uIHRoZSBmb2xsb3dpbmcgcmVuZGVya2l0cyIpOwotCi0gICAgICAgIGlmIChfYXR0ckRvY1NwYW5zQ29sdW1ucykKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotICAgICAgICAgIG91dC53cml0ZSgiPHRyPlxuIik7Ci0gICAgICAgICAgb3V0LndyaXRlKCI8dGQgY29sc3Bhbj1cIjNcIj5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPHRkPlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vICAgICAgICBvdXQud3JpdGUoRXNjYXBlVXRpbHMuZXNjYXBlRWxlbWVudFZhbHVlKGRvYy5kb2MpKTsKLSAgICAgICAgaWYgKHZhbFN0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LndyaXRlKHZhbFN0cik7Ci0gICAgICAgICAgb3V0LndyaXRlKCI8YnIvPiIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZShhdHRyLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBpZiAodW5zdXBBZ2VudHNTdHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPGJyLz4iKTsKLSAgICAgICAgICBvdXQud3JpdGUodW5zdXBBZ2VudHNTdHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bnN1cFJrU3RyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQud3JpdGUoIjxici8+Iik7Ci0gICAgICAgICAgb3V0LndyaXRlKHVuc3VwUmtTdHIpOwotICAgICAgICB9Ci0gICAgICAgIC8vb3V0LndyaXRlKEVzY2FwZVV0aWxzLmVzY2FwZUFtcGVyc2FuZHMoZG9jLmRvYykpOwotICAgICAgICBvdXQud3JpdGUoIjwvdGQ+XG4iKTsKLSAgICAgIH0KLQotICAgICAgb3V0LndyaXRlKCI8L3RyPlxuIik7Ci0gICAgfQotCi0gICAgaWYgKHdyaXR0ZW5BbnlBdHRyaWJ1dGVzKQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPC90YWJsZT5cbiIpOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC53cml0ZSgiPC9zdWJzZWN0aW9uPlxuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgU3RyaW5nIF9nZXREaXNwbGF5VHlwZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZS5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUuc3Vic3RyaW5nKCJqYXZhLmxhbmcuIi5sZW5ndGgoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJiaW5kaW5nIi5lcXVhbHMobmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NOYW1lLCAiLiIsIHRydWUpOwotICAgICAgU3RyaW5nIG91dCA9ICIiOwotICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLSAgICAgICAgb3V0ID0gb3V0ICsgdG9rZW47Ci0gICAgICAgIC8vIEdpdmUgb3Vyc2VsdmVzIGFuIG9wcG9ydHVuaXR5IGZvciBhIGxpbmUgYnJlYWsgYWZ0ZXIgImNvbXBvbmVudC4iOwotICAgICAgICBpZiAob3V0LmVuZHNXaXRoKCJjb21wb25lbnQuIikpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQgPSBvdXQgKyAiPHdici8+IjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIHJldHVybiB0eXBlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEV2ZW50cyhXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LndyaXRlKCI8dGFibGU+XG4iKTsKLSAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPlR5cGU8L3RoPlxuIik7Ci0gICAgb3V0LndyaXRlKCI8dGg+UGhhc2VzPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPkRlc2NyaXB0aW9uPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotCi0gICAgSXRlcmF0b3IgaXRlciA9IGJlYW4uZXZlbnRzKHRydWUpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKSBpdGVyLm5leHQoKTsKLSAgICAgIEV2ZW50QmVhbiAgICBldmVudCA9IGV2ZW50UmVmLnJlc29sdmVFdmVudFR5cGUoKTsKLQotICAgICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBldmVudC5nZXRFdmVudENsYXNzKCkgKyAiPC90ZD4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkIG5vd3JhcD1cIm5vd3JhcFwiPiIpOwotICAgICAgU3RyaW5nW10gcGhhc2VzID0gZXZlbnRSZWYuZ2V0RXZlbnREZWxpdmVyeVBoYXNlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiLDxici8+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKChTdHJpbmcpIHBoYXNlc1tpXSk7Ci0gICAgICB9Ci0KLSAgICAgIG91dC53cml0ZSgiPC90ZD4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBldmVudC5nZXREZXNjcmlwdGlvbigpICsgIjwvdGQ+Iik7Ci0gICAgICBvdXQud3JpdGUoIjwvdHI+XG4iKTsKLSAgICB9Ci0KLSAgICBvdXQud3JpdGUoIjwvdGFibGU+XG4iKTsKLSAgfQotCi0KLQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEZhY2V0cyhXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gU29ydCB0aGUgZmFjZXRzCi0gICAgVHJlZVNldCBmYWNldE5hbWVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYmVhbi5mYWNldHModHJ1ZSk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGZhY2V0TmFtZXMuYWRkKCgoRmFjZXRCZWFuKSBpdGVyLm5leHQoKSkuZ2V0RmFjZXROYW1lKCkpOwotICAgIH0KLQotICAgIG91dC53cml0ZSgiPHRhYmxlPlxuIik7Ci0gICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICBvdXQud3JpdGUoIjx0aD5OYW1lPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPkRlc2NyaXB0aW9uPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotCi0gICAgSXRlcmF0b3IgbmFtZUl0ZXIgPSBmYWNldE5hbWVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG5hbWVJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVJdGVyLm5leHQoKTsKLSAgICAgIEZhY2V0QmVhbiBmYWNldCA9IGJlYW4uZmluZEZhY2V0KG5hbWUsIHRydWUpOwotICAgICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBmYWNldC5nZXRGYWNldE5hbWUoKSArICI8L3RkPiIpOwotICAgICAgb3V0LndyaXRlKCI8dGQ+Iik7Ci0gICAgICBvdXQud3JpdGUoZmFjZXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBvdXQud3JpdGUoIjwvdGQ+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotICAgIH0KLQotICAgIG91dC53cml0ZSgiPC90YWJsZT5cbiIpOwotICB9Ci0KLQotCi0KLSAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNpdGVSZW5kZXJlciBnZXRTaXRlUmVuZGVyZXIoKQotICB7Ci0gICAgcmV0dXJuIHNpdGVSZW5kZXJlcjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSggTG9jYWxlIGxvY2FsZSApCi0gIHsKLSAgICByZXR1cm4gIkpTRiBUYWcgRG9jdW1lbnRhdGlvbiI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCBMb2NhbGUgbG9jYWxlICkKLSAgewotICAgIHJldHVybiAiRG9jdW1lbnRhdGlvbiBmb3IgSlNGIFRhZ3MiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkKLSAgewotICAgIHJldHVybiAidGFnZG9jIjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleCgKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICBTdHJpbmcgICAgICAgcmVzb3VyY2VQYXRoKSB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgewotICAgIF9mYWNlc0NvbmZpZyA9IG5ldyBGYWNlc0NvbmZpZ0JlYW4oKTsKLQotICAgIFVSTFtdIGluZGV4ID0gcmVhZEluZGV4KHByb2plY3QpOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGluZGV4Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb2Nlc3NJbmRleEVudHJ5KGluZGV4W2ldKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5kZXhFbnRyeSgKLSAgICBVUkwgZW50cnkpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbmV3IEZhY2VzQ29uZmlnUGFyc2VyKCkubWVyZ2UoX2ZhY2VzQ29uZmlnLCBlbnRyeSk7Ci0gICAgfQotICAgIGNhdGNoIChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBmYWNlcyBjb25maWciLGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBGYWNlc0NvbmZpZ0JlYW4gZ2V0RmFjZXNDb25maWcoKQotICB7Ci0gICAgcmV0dXJuIF9mYWNlc0NvbmZpZzsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TWFzdGVyQ29uZmlncygKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCkgdGhyb3dzIE1hdmVuUmVwb3J0RXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIjsKLSAgICByZXR1cm4gZ2V0Q29tcGlsZURlcGVuZGVuY3lSZXNvdXJjZXMocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldENvbXBpbGVEZXBlbmRlbmN5UmVzb3VyY2VzKAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgIFN0cmluZyAgICAgICByZXNvdXJjZVBhdGgpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIocHJvamVjdCk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gY2wuZ2V0UmVzb3VyY2VzKHJlc291cmNlUGF0aCk7Ci0gICAgICBMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICB1cmxzLmFkZCh1cmwpOwotICAgICAgfQotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodXJscyk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCByZXNvdXJjZXMgZm9yIHBhdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgcmVzb3VyY2VQYXRoICsgIlwiIiwgZSk7Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgVVJMW10gcmVhZEluZGV4KAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIDEuIHJlYWQgbWFzdGVyIGZhY2VzLWNvbmZpZy54bWwgcmVzb3VyY2VzCi0gICAgICBMaXN0IG1hc3RlcnMgPSBnZXRNYXN0ZXJDb25maWdzKHByb2plY3QpOwotICAgICAgaWYgKG1hc3RlcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJNYXN0ZXIgZmFjZXMtY29uZmlnLnhtbCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIG5ldyBVUkxbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHNwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgLy8gcmVxdWlyZXMgSkFYUCAxLjMsIGluIEphdmFTRSA1LjAKLSAgICAgICAgLy8gc3BmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaT1tYXN0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKWkubmV4dCgpOwotICAgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKHNwZi5uZXdTQVhQYXJzZXIoKSk7Ci0gICAgICAgICAgZGlnZXN0ZXIuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0KLSAgICAgICAgICAvLyBYSW5jbHVkZQotICAgICAgICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsICJhZGQiLCAxKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxDcmVhdGlvbkZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLCAwLCAwKTsKLQotICAgICAgICAgIGRpZ2VzdGVyLnB1c2godXJsKTsKLSAgICAgICAgICBkaWdlc3Rlci5wdXNoKGVudHJpZXMpOwotICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChVUkxbXSllbnRyaWVzLnRvQXJyYXkobmV3IFVSTFswXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBtYXN0ZXIgY29uZmlnIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgIENsYXNzTG9hZGVyIGNsID0gY3VycmVudC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIExpc3QgY2xhc3NwYXRoRWxlbWVudHMgPSBwcm9qZWN0LmdldENvbXBpbGVDbGFzc3BhdGhFbGVtZW50cygpOwotICAgICAgaWYgKCFjbGFzc3BhdGhFbGVtZW50cy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSAoU3RyaW5nW10pY2xhc3NwYXRoRWxlbWVudHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbZW50cmllcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsc1tpXSA9IG5ldyBGaWxlKGVudHJpZXNbaV0pLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscywgY2wpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiRXJyb3IgY2FsY3VsYXRpbmcgc2NvcGUgY2xhc3NwYXRoIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oIkVycm9yIGNhbGN1bGF0aW5nIHNjb3BlIGNsYXNzcGF0aCIsIGUpOwotICAgIH0KLQotICAgIHJldHVybiBjbDsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgY2xhc3MgVVJMQ3JlYXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RDcmVhdGlvbkZhY3RvcnkKLSAgewotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KAotICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICBpZiAoaHJlZiA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIGhyZWYgYXR0cmlidXRlIik7Ci0gICAgICB9Ci0KLSAgICAgIFVSTCBtYXN0ZXIgPSAoVVJMKWRpZ2VzdGVyLmdldFJvb3QoKTsKLSAgICAgIHJldHVybiBuZXcgVVJMKG1hc3RlciwgaHJlZik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByb3RlY3RlZCBjbGFzcyBTa2lwRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgIC8vIGFsd2F5cyBza2lwIEFQSSBhbmQgYmFzZSBjbGFzcyBnZW5lcmF0aW9uCi0gICAgICByZXR1cm4gKCFjb21wb25lbnRUeXBlLnN0YXJ0c1dpdGgoImphdmF4IikgJiYKLSAgICAgICAgICAgICAgIWNvbXBvbmVudFR5cGUuZW5kc1dpdGgoIkJhc2UiKSk7Ci0gICAgfQotICB9Ci0KLQotCi0gIHByaXZhdGUgY2xhc3MgQ29tcG9uZW50TmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29tcG9uZW50TmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgVmFsaWRhdG9yQmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ29udmVydGVyTmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29udmVydGVyTmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29udmVydGVyQmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIFRhZ0F0dHJpYnV0ZUZpbHRlciBleHRlbmRzIFByb3BlcnR5RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudFRhZ0ZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIChjb21wb25lbnQuZ2V0VGFnTmFtZSgpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29udmVydGVyVGFnRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gKGNvbnZlcnRlci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yVGFnRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICByZXR1cm4gKHZhbGlkYXRvci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gX2ZhY2VzQ29uZmlnOwotCi0KLQotICAvLyB0b2RvOiBtYWtlIHRoaXMgY29uZmlndXJhYmxlPwotICBwcml2YXRlIGJvb2xlYW4gX2F0dHJEb2NTcGFuc0NvbHVtbnMgPSBmYWxzZTsKLQotICAvKioKLSAgICogU3BlY2lmaWVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCB3aWxsIGJlIGdlbmVyYXRlZAotICAgKgotICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RGlyZWN0b3J5fSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotICAKLQotICAvKioKLSAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBvcmlnaW5hbCBzaXRlIGlzIHByZXNlbnQuCi0gICAqIChUUklFRCB1c2luZyAke2Jhc2VEaXJ9L3NyYy9zaXRlOyAgdGhhdCBpbnNlcnRlZCBhICdudWxsJyBpbnRvCi0gICAqIHRoZSBzdHJpbmcgZm9yIHNvbWUgcmVhc29uLiAgVFJJRUQgdXNpbmcgJHtzaXRlRGlyZWN0b3J5fSwKLSAgICogd2hpY2ggd2FzIHVuZGVmaW5lZC4gIFRSSUVEICR7cHJvamVjdC5kaXJlY3Rvcnl9c3JjL3NpdGU7IHdoaWNoIGFsc28KLSAgICogaW5zZXJ0ZWQgYSBudWxsLiAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vLi4vc3JjL3NpdGUgc2VlbXMgdG8gd29yaywKLSAgICogdGhvdWdoIGl0IGFzc3VtZXMgdGhhdCAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSBpcyAKLSAgICogJHtwcm9qZWN0LmRpcmVjdG9yeX0vdGFyZ2V0LgotICAgKiAKLSAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uLi9zcmMvc2l0ZS8iCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHNpdGVEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgTWFwIHRhZ2xpYnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlUGF0aDsKLQotCi0gIC8qKgotICAgKiBAY29tcG9uZW50Ci0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU2l0ZVJlbmRlcmVyIHNpdGVSZW5kZXJlcjsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0RPQ19TVUJESVJFQ1RPUlkgPSAidGFnZG9jIjsKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX05PTl9ET0NVTUVOVEVEX0FHRU5UUyA9IHsicGhvbmUiLCAidm9pY2UifTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjJmZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhZjY3NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLXdhZ29uLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFdhZ29uIFBsdWdpbjwvbmFtZT4KLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9tYXZlbi90cnVuay93YWdvbi1tYXZlbi1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL21hdmVuL3RydW5rL3dhZ29uLW1hdmVuLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9teWZhY2VzL21hdmVuL3RydW5rL3dhZ29uLW1hdmVuLXBsdWdpbjwvdXJsPgotICA8L3NjbT4KLSAgPGJ1aWxkPgotICAgIDxleHRlbnNpb25zPgotICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tc3NoLWV4dGVybmFsPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgIDwvZXh0ZW5zaW9ucz4KLSAgPC9idWlsZD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPGlkPm15ZmFjZXMtc3RhZ2luZzwvaWQ+Ci0gICAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBTdGFnaW5nIFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9tMi1zdGFnaW5nLXJlcG9zaXRvcnk8L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgPGlkPmFwYWNoZS1tYXZlbi1zbmFwc2hvdHM8L2lkPgotICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8c2l0ZT4KLSAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICA8bmFtZT5BcGFjaGUgV2Vic2l0ZTwvbmFtZT4KLSAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy93YWdvbi1tYXZlbi1wbHVnaW48L3VybD4KLSAgICA8L3NpdGU+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8bGlua3M+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2oyZWUvMS40L2RvY3MvYXBpPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvYXBpPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2NvbGxlY3Rpb25zL2FwaWRvY3MtQ09MTEVDVElPTlNfM18wLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9kYmNwL2FwaWRvY3MvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2ZpbGV1cGxvYWQvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvaHR0cGNsaWVudC9hcGlkb2NzLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9sb2dnaW5nL2FwaWRvY3MvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL3Bvb2wvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vd3d3Lmp1bml0Lm9yZy9qdW5pdC9qYXZhZG9jLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9hcGkvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FwaS88L2xpbms+Ci0gICAgICAgICAgPC9saW5rcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD50YWdsaXN0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLQotICA8cHJvZmlsZXM+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgotICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KLSAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICA8L2J1aWxkPgotICAgIDwvcHJvZmlsZT4KLSAgPC9wcm9maWxlcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3dhZ29uL1dhZ29uTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3dhZ29uL1dhZ29uTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU3ZmU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi93YWdvbi9XYWdvbk1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ud2Fnb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1hbmFnZXIuV2Fnb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5Db25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24uUmVzb3VyY2VEb2VzTm90RXhpc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5UcmFuc2ZlckZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLndhZ29uLlVuc3VwcG9ydGVkUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5XYWdvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLndhZ29uLmF1dGhlbnRpY2F0aW9uLkF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24uYXV0aG9yaXphdGlvbi5BdXRob3JpemF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24ub2JzZXJ2ZXJzLkRlYnVnOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24ucmVwb3NpdG9yeS5SZXBvc2l0b3J5OwotCi0KLS8qKgotICogRGVwbG95cyB0aGUgY29udGVudCBvZiBhIGRpcmVjdG9yeSB1c2luZyBzY3AvZmlsZSBwcm90b2NvbC4KLSAqIEZvciBzY3AgcHJvdG9jb2wsIGZpbGVzIGFyZSBwYWNrYWdlZCBpbnRvIHppcCBhcmNoaXZlLAotICogdGhlbiBhcmNoaXZlIGlzIHRyYW5zZnJlZCB0byByZW1vdGUgaG9zdCwgbmV4dGx5IGl0IGlzIHVuLWFyY2hpdmVkLgotICogVGhpcyBtZXRob2Qgb2YgZGVwbG95bWVudCBzaG91bGQgbm9ybWFsbHkgYmUgbXVjaCBmYXN0ZXIKLSAqIHRoZW4gbWFraW5nIGZpbGUgYnkgZmlsZSBjb3B5LiAgRm9yIGZpbGUgcHJvdG9jb2wsIHRoZSBmaWxlcyBhcmUgY29waWVkCi0gKiBkaXJlY3RseSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotICoKLSAqIEB2ZXJzaW9uIAotICogQGdvYWwgZGVwbG95Ci0gKi8KLXB1YmxpYyBjbGFzcyBXYWdvbk1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgICAvKioKLSAgICAgKiBEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgZm9yIHdhZ29uLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBpbnB1dERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAgKiBTcGVjaWZpZXMgdGhlIHNlcnZlciBpZC4KLSAgICAgICoKLSAgICAgICogQHBhcmFtZXRlcgotICAgICAgKiAqIEByZXF1aXJlZAotICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxsIFVSTCBvZiB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVybDsKLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFdhZ29uTWFuYWdlciB3YWdvbk1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggIWlucHV0RGlyZWN0b3J5LmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJUaGUgaW5wdXREaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBuZXcgUmVwb3NpdG9yeSggaWQsIHVybCApOwotCi0KLSAgICAgICAgV2Fnb24gd2Fnb24gPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd2Fnb24gPSB3YWdvbk1hbmFnZXIuZ2V0V2Fnb24oIHJlcG9zaXRvcnkuZ2V0UHJvdG9jb2woKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVW5zdXBwb3J0ZWRQcm90b2NvbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJVbnN1cHBvcnRlZCBwcm90b2NvbDogJyIgKyByZXBvc2l0b3J5LmdldFByb3RvY29sKCkgKyAiJyIsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIXdhZ29uLnN1cHBvcnRzRGlyZWN0b3J5Q29weSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIldhZ29uIHByb3RvY29sICciICsgcmVwb3NpdG9yeS5nZXRQcm90b2NvbCgpICsgIicgZG9lc24ndCBzdXBwb3J0IGRpcmVjdG9yeSBjb3B5aW5nIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERlYnVnIGRlYnVnID0gbmV3IERlYnVnKCk7Ci0KLSAgICAgICAgICAgIHdhZ29uLmFkZFNlc3Npb25MaXN0ZW5lciggZGVidWcgKTsKLQotICAgICAgICAgICAgd2Fnb24uYWRkVHJhbnNmZXJMaXN0ZW5lciggZGVidWcgKTsKLQotICAgICAgICAgICAgd2Fnb24uY29ubmVjdCggcmVwb3NpdG9yeSwgd2Fnb25NYW5hZ2VyLmdldEF1dGhlbnRpY2F0aW9uSW5mbyggaWQgKSApOwotCi0gICAgICAgICAgICB3YWdvbi5wdXREaXJlY3RvcnkoIGlucHV0RGlyZWN0b3J5LCAiLiIgKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggUmVzb3VyY2VEb2VzTm90RXhpc3RFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdXBsb2FkaW5nIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVHJhbnNmZXJGYWlsZWRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdXBsb2FkaW5nIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciB1cGxvYWRpbmciLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBDb25uZWN0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIHVwbG9hZGluZyIsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIHVwbG9hZGluZyIsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdhZ29uLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggQ29ubmVjdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvciggIkVycm9yIGRpc2Nvbm5lY3Rpbmcgd2Fnb24gLSBpZ25vcmVkIiwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmOTQ1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMNCi1Db3B5cmlnaHQgMjAwNC0yMDA3IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnk6DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL3NpdGUvYXB0L3VzYWdlLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3YTMxNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSB+fgotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gfn4KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgICAgICAgICAgLS0tLS0KLSAgICAgICAgICAgVXNhZ2UKLSAgICAgICAgICAgLS0tLS0KLQotVXNhZ2UKLQotICBUaGUgcGx1Z2luIG9mZmVycyBhIGdvYWwgZm9yIHRyYW5zcG9ydCB0aGUgY29udGVudCBvZiBhIGRpcmVjdG9yeSB3aXRoIHdhZ29uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICAuLi4KLSAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGlkPm15ZmFjZXMtbmlnaHRseS1idWlsZHM8L2lkPgotICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICAuLi4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODFiZDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJXYWdvbiBNYXZlbiBQbHVnaW4iPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5NeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1hZ2VzL215ZmFjZXMtbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIgLz4KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iTWF2ZW4gMiIgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4yLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZyIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8aXRlbSBuYW1lPSJJbnRyb2R1Y3Rpb24iIGhyZWY9ImluZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkdvYWxzIiBocmVmPSJwbHVnaW4taW5mby5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJVc2FnZSIgaHJlZj0idXNhZ2UuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgICAke3JlcG9ydHN9Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0MTJjOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy14cnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFhSVFMgUGx1Z2luPC9uYW1lPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgIDxzaG93V2FybmluZ3M+dHJ1ZTwvc2hvd1dhcm5pbmdzPgotICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnQ+LVhsaW50OmFsbCwtc2VyaWFsLC1mYWxsdGhyb3VnaDwvY29tcGlsZXJBcmd1bWVudD4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgPC9wbHVnaW5zPgotICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0Fic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9BYnN0cmFjdEdlbmVyYXRlU291cmNlc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjMTJmNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0Fic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi54cnRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBYUlRTIEJ1bmRsZXMKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2VuZXJhdGVCdW5kbGVzKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFR5cGUoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RGVmYXVsdExvY2FsZXMoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgRmlsZSBnZXRUYXJnZXREaXJlY3RvcnkoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBhZGRDb21waWxlU291cmNlUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVCdW5kbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIHNvdXJjZURpcmVjdG9yeSA9IGdldFNvdXJjZURpcmVjdG9yeSgpOwotICAgIGlmIChzb3VyY2VEaXJlY3RvcnkuZXhpc3RzKCkpCi0gICAgewotICAgICAgLy8gSW5jbHVkZSBnZW5lcmF0ZWQgc291cmNlcyBpbiBjb21waWxhdGlvbgotICAgICAgYWRkQ29tcGlsZVNvdXJjZVJvb3QoKTsKLQotICAgICAgLy8gU2NhbiBmb3IgLnhydHMgc291cmNlcwotICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgIHNjYW5uZXIuc2V0QmFzZWRpcihzb3VyY2VEaXJlY3RvcnkpOwotICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0gZ2V0RXhjbHVkZXMoKTsKLSAgICAgIHNjYW5uZXIuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyAiKiovKi54cnRzIiB9KTsKLSAgICAgIHNjYW5uZXIuc2NhbigpOwotCi0gICAgICBTdHJpbmdbXSB4cnRzRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgIGlmICh4cnRzRmlsZXMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgUlRTV3JpdGVyIHdyaXRlciA9IGdldFJUU1dyaXRlcigpOwotICAgICAgICBNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBMaXN0IGRpcnR5WFJUUyA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cy5hc0xpc3QoeHJ0c0ZpbGVzKSk7Ci0gICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGk9ZGlydHlYUlRTLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB4cnRzRmlsZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gZ2V0VGFyZ2V0RmlsZSh4cnRzRmlsZSk7Ci0gICAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gZ2V0U291cmNlRmlsZSh4cnRzRmlsZSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSA+PSBzb3VyY2VGaWxlLmxhc3RNb2RpZmllZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXJ0eVhSVFMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIGFsbCBYUlRTIGJ1bmRsZXMgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nICIgKyBkaXJ0eVhSVFMuc2l6ZSgpICsgIiBYUlRTIGJ1bmRsZXMgdG8gIiArIGdldFRhcmdldERpcmVjdG9yeSgpKTsKLQotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaT1kaXJ0eVhSVFMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB4cnRzRmlsZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBnZXRTb3VyY2VGaWxlKHhydHNGaWxlKTsKLSAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IGdldFRhcmdldEZpbGUoeHJ0c0ZpbGUpOwotICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gZ2V0QmFzZW5hbWUoeHJ0c0ZpbGUpOwotCi0gICAgICAgICAgICBwYXJhbXMucHV0KCJvdXRGaWxlIiwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBwYXJhbXMucHV0KCJvdXROYW1lIiwgYmFzZU5hbWUpOwotICAgICAgICAgICAgcGFyYW1zLnB1dCgic3JjTmFtZSIsIGJhc2VOYW1lKTsKLSAgICAgICAgICAgIHBhcmFtcy5wdXQoInF1aWV0TW9kZSIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBwYXJhbXMucHV0KCJkZWZhdWx0TG9jYWxlcyIsIGdldERlZmF1bHRMb2NhbGVzKCkpOwotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlRmlsZSkpOwotICAgICAgICAgICAgLy8gc2V0dXAgcmVsYXRpdmUgc3lzdGVtSWQgcmVzb2x1dGlvbiBmb3IgbG9jYWwgcnRzLmR0ZCBmaWxlcy4KLSAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzb3VyY2VGaWxlLmdldFBhcmVudEZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgICBYUlRTR2VuZXJhdG9yLmdlbmVyYXRlKHBhcnNlciwgc291cmNlLCB3cml0ZXIsIHBhcmFtcyk7Ci0gICAgICAgICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24odC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgUlRTV3JpdGVyIGdldFJUU1dyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGltcGxDbGFzc05hbWU7Ci0KLSAgICBTdHJpbmcgdGFyZ2V0VHlwZSA9IGdldFRhcmdldFR5cGUoKTsKLSAgICBpZiAodGFyZ2V0VHlwZS5zdGFydHNXaXRoKCJjbGFzczoiKSkKLSAgICB7Ci0gICAgICBpbXBsQ2xhc3NOYW1lID0gdGFyZ2V0VHlwZS5zdWJzdHJpbmcoImNsYXNzOiIubGVuZ3RoKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCJsaXN0Ii5lcXVhbHModGFyZ2V0VHlwZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdFJUU1dyaXRlcigpOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVua25vd24gYnVuZGxlIHR5cGU6ICIgKyB0YXJnZXRUeXBlKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBDbGFzcyBpbXBsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGltcGxDbGFzc05hbWUpOwotICAgICAgcmV0dXJuIChSVFNXcml0ZXIpaW1wbENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgfQotICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBGaWxlIGdldFNvdXJjZUZpbGUoU3RyaW5nIHhydHNGaWxlbmFtZSkKLSAgewotICAgIHJldHVybiBuZXcgRmlsZShnZXRTb3VyY2VEaXJlY3RvcnkoKSwgeHJ0c0ZpbGVuYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEJhc2VuYW1lKFN0cmluZyBzb3VyY2VQYXRoKQotICB7Ci0gICAgaW50IHN0YXJ0ID0gc291cmNlUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpICsgMTsKLSAgICByZXR1cm4gc291cmNlUGF0aC5zdWJzdHJpbmcoc3RhcnQsIHNvdXJjZVBhdGgubGVuZ3RoKCkgLSAiLnhydHMiLmxlbmd0aCgpKTsKLSAgfQotCi0gIHByaXZhdGUgRmlsZSBnZXRUYXJnZXRGaWxlKFN0cmluZyBzb3VyY2VQYXRoKQotICB7Ci0gICAgU3RyaW5nIGJhc2VuYW1lID0gc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgc291cmNlUGF0aC5sZW5ndGgoKSAtICIueHJ0cyIubGVuZ3RoKCkpOwotICAgIFN0cmluZyB0YXJnZXRQYXRoID0gYmFzZW5hbWUgKyAiLmphdmEiOwotICAgIHJldHVybiBuZXcgRmlsZShnZXRUYXJnZXREaXJlY3RvcnkoKSwgdGFyZ2V0UGF0aCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvR2VuZXJhdGVTb3VyY2VzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9HZW5lcmF0ZVNvdXJjZXNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NWZkNjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9HZW5lcmF0ZVNvdXJjZXNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCBnZW5lcmF0ZS1zb3VyY2VzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBYUlRTIEJ1bmRsZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlU291cmNlc01vam8gZXh0ZW5kcyBBYnN0cmFjdEdlbmVyYXRlU291cmNlc01vam8KLXsKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJsaXN0IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFR5cGU7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gZGVmYXVsdExvY2FsZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gZXhjbHVkZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4veHJ0cyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgc291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXhydHMtcGx1Z2luL21haW4vamF2YSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREZWZhdWx0TG9jYWxlcygpCi0gIHsKLSAgICByZXR1cm4gZGVmYXVsdExvY2FsZXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKQotICB7Ci0gICAgcmV0dXJuIGV4Y2x1ZGVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsZVNvdXJjZVJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QodGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldFR5cGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIHNvdXJjZURpcmVjdG9yeTsKLSAgfQotCi0gIHByb3RlY3RlZCBGaWxlIGdldFRhcmdldERpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0RGlyZWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0dlbmVyYXRlVGVzdFNvdXJjZXNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0dlbmVyYXRlVGVzdFNvdXJjZXNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTNjZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9HZW5lcmF0ZVRlc3RTb3VyY2VzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgZ2VuZXJhdGUtdGVzdC1zb3VyY2VzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtdGVzdC1zb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBnZW5lcmF0ZXMgdGhlIFhSVFMgQnVuZGxlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVUZXN0U291cmNlc01vam8gZXh0ZW5kcyBBYnN0cmFjdEdlbmVyYXRlU291cmNlc01vam8KLXsKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJsaXN0IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFR5cGU7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gZGVmYXVsdExvY2FsZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gdGVzdEV4Y2x1ZGVzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy90ZXN0L3hydHMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRlc3RTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4teHJ0cy1wbHVnaW4vdGVzdC9qYXZhIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldERlZmF1bHRMb2NhbGVzKCkKLSAgewotICAgIHJldHVybiBkZWZhdWx0TG9jYWxlczsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeGNsdWRlcygpCi0gIHsKLSAgICByZXR1cm4gdGVzdEV4Y2x1ZGVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsZVNvdXJjZVJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHByb2plY3QuYWRkVGVzdENvbXBpbGVTb3VyY2VSb290KHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0YXJnZXRUeXBlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiB0ZXN0U291cmNlRGlyZWN0b3J5OwotICB9Ci0KLSAgcHJvdGVjdGVkIEZpbGUgZ2V0VGFyZ2V0RGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiB0YXJnZXREaXJlY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvTGlzdFJUU1dyaXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9MaXN0UlRTV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjcyNWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9MaXN0UlRTV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotLy9pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSA8Y29kZT5MaXN0UlRTV3JpdGVyPC9jb2RlPiBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIDxjb2RlPlJUU1dyaXRlcjwvY29kZT4gaW50ZXJmYWNlIHVzZWQgdG8gY3JlYXRlIGEgU3VuCi0gKiA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+IGZpbGUuCi0gKgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb246IDEuMTEgJCkgJERhdGU6IDIwMDIvMDIvMjcgMTc6MTg6NDcgJAotICogQHNpbmNlIFJUUyAyLjAKLSAqLwotcHVibGljIGNsYXNzIExpc3RSVFNXcml0ZXIgaW1wbGVtZW50cyBSVFNXcml0ZXIKLXsKLQotICAvKioKLSAgICogRW1wdHkgY29uc3RydWN0b3IgZm9yIHRoZSA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+IGltcGxlbWVudGF0aW9uCi0gICAqCi0gICAqLwotICBwdWJsaWMgTGlzdFJUU1dyaXRlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbiB0byB3cml0ZSB0aGUgaGVhZGVyIG9mIHRoZQotICAgKiA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+IGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJtcyBhIDxjb2RlPk1hcDwvY29kZT4gb2YgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCi0gICAqIEBwYXJhbSBtZXRhIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBwYXJzZWQgbm9uLXJlc291cmNlIGRhdGEKLSAgICogKGUuZy4sIGF1dGhvcnMpLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRCdW5kbGUoTWFwIHBhcm1zLCBNYXAgbWV0YSkKLSAgICB0aHJvd3MgVGhyb3dhYmxlCi0gIHsKLSAgICBGaWxlIG91dEZpbGUgPSAoRmlsZSlwYXJtcy5nZXQoIm91dEZpbGUiKTsKLSAgICBTdHJpbmcgb3V0TmFtZSA9IChTdHJpbmcpcGFybXMuZ2V0KCJvdXROYW1lIik7Ci0gICAgU3RyaW5nIHNyY05hbWUgPSAoU3RyaW5nKXBhcm1zLmdldCgic3JjTmFtZSIpOwotCi0gICAgQm9vbGVhbiBiID0gKEJvb2xlYW4pcGFybXMuZ2V0KCJxdWlldE1vZGUiKTsKLSAgICBib29sZWFuIHF1aWV0TW9kZSA9IGIuYm9vbGVhblZhbHVlKCk7Ci0gICAgaWYgKCFxdWlldE1vZGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyBvdXRGaWxlKTsKLSAgICB9Ci0KLSAgICBfcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dEZpbGUpKSk7Ci0KLSAgICBfcHcucHJpbnRsbigiLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlISIpOwotICAgIF9wdy5wcmludGxuKCIvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIik7Ci0KLSAgICBTdHJpbmcgcnRzRmlsZVR5cGUgPSAieHJ0cyI7Ci0gICAgaWYgKG1ldGEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBydHNGaWxlVHlwZSA9IChTdHJpbmcpbWV0YS5nZXQoImZpbGVUeXBlIik7Ci0gICAgfQotICAgIF9wdy5wcmludGxuKCIvLyBFZGl0ICIgKyBzcmNOYW1lICsgIi4iICsgcnRzRmlsZVR5cGUgKyAiIGFuZCBydW4gdGhlICIgKwotICAgICAgcnRzRmlsZVR5cGUudG9VcHBlckNhc2UoKSArICJNYWtlQnVuZGxlIHRvb2wgaW5zdGVhZC4iKTsKLSAgICBfcHcucHJpbnRsbigiLy8gIik7Ci0KLSAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSAoU3RyaW5nKXBhcm1zLmdldCgicGtnTmFtZSIpOwotICAgIGJvb2xlYW4gdmFsaWRQYWNrYWdlID0gZmFsc2U7Ci0gICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgaWYgKG1ldGEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1ldGEuZ2V0KCJwYWNrYWdlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhY2thZ2VOYW1lID0gKFN0cmluZyltZXRhLmdldCgicGFja2FnZSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBhY2thZ2VOYW1lICE9IG51bGwgJiYKLSAgICAgICghcGFja2FnZU5hbWUuZXF1YWxzKCIiKSB8fCAhcGFja2FnZU5hbWUudHJpbSgpLmVxdWFscygiIikpKQotICAgIHsKLSAgICAgIF9wdy5wcmludGxuKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7Iik7Ci0gICAgICBfcHcucHJpbnRsbigiIik7Ci0gICAgICB2YWxpZFBhY2thZ2UgPSB0cnVlOwotICAgIH0KLQotICAgIF9wdy5wcmludGxuKCJpbXBvcnQgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZTsiKTsKLQotICAgIHdyaXRlSW1wb3J0cyhwYXJtcywgbWV0YSk7Ci0KLSAgICBfcHcucHJpbnRsbigiIik7Ci0gICAgX3B3LnByaW50bG4oInB1YmxpYyBjbGFzcyAiICsgb3V0TmFtZSArICIgZXh0ZW5kcyBMaXN0UmVzb3VyY2VCdW5kbGUgeyIpOwotICAgIF9wdy5wcmludGxuKCIgIEBPdmVycmlkZSIpOwotICAgIF9wdy5wcmludGxuKCIgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeyIpOwotICAgIF9wdy5wcmludGxuKCIgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsiKTsKLQotICAgIGlmIChvdXROYW1lLmluZGV4T2YoJ18nKSA8IDApCi0gICAgewotICAgICAgLy8gVGhpcyBpcyB0aGUgYmFzZSBidW5kbGUuIElmIGFueSBkZWZhdWx0IGxvY2FsZXMgYXJlIHJlcXVlc3RlZCwKLSAgICAgIC8vIHRoZXknbGwgZXh0ZW5kIHRoaXMgYnVuZGxlLiBDcmVhdGUgdGhlbSBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSBhbGwKLSAgICAgIC8vIHRoZSBuZWVkZWQgaW5mby4KLSAgICAgIFN0cmluZ1tdIGxvY2FsZXMgPSAoU3RyaW5nW10pIHBhcm1zLmdldCgiZGVmYXVsdExvY2FsZXMiKTsKLSAgICAgIEZpbGUgdGFyZ0RpciA9IG91dEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgaWYgKChsb2NhbGVzICE9IG51bGwpICYmICh0YXJnRGlyICE9IG51bGwpKQotICAgICAgewotICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGxvY2FsZXMubGVuZ3RoOyBsKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY05hbWUgPSBvdXROYW1lICsgJ18nICsgbG9jYWxlc1tsXTsKLSAgICAgICAgICBGaWxlIGxvY0YgPSBuZXcgRmlsZSh0YXJnRGlyLCBjTmFtZSArICIuamF2YSIpOwotICAgICAgICAgIAotICAgICAgICAgIFByaW50V3JpdGVyIGxvY1dyaTsgCi0gICAgICAgICAgbG9jV3JpID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihsb2NGKSkpOwotCi0gICAgICAgICAgbG9jV3JpLnByaW50bG4oIi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEiKTsKLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigiLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiIpOwotCi0gICAgICAgICAgaWYgKHZhbGlkUGFja2FnZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb2NXcmkucHJpbnRsbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiOyIpOwotICAgICAgICAgICAgbG9jV3JpLnByaW50bG4oIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigicHVibGljIGNsYXNzICIgKyBjTmFtZSArICIgZXh0ZW5kcyAiICsgb3V0TmFtZSk7Ci0gICAgICAgICAgbG9jV3JpLnByaW50bG4oInsiKTsKLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigifSIpOwotICAgICAgICAgIGxvY1dyaS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbXBvcnRzKE1hcCBwYXJtcywgTWFwIG1ldGEpCi0gICAgIHRocm93cyBUaHJvd2FibGUKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoTWFwIHBhcm1zLCBNYXAgbWV0YSwgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKLSAgewotICAgIF9wdy5wcmludGxuKCIgICAge1wiIiArIFVuaWNvZGVFc2NhcGVzLmNvbnZlcnQoa2V5KSArICJcIiwgXCIiICsKLSAgICAgICAgICAgICAgICBVbmljb2RlRXNjYXBlcy5jb252ZXJ0KHZhbHVlKSArICJcIn0sIik7Ci0gIH0KLQotCi0gIC8qKgotICAgKiA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbiB0byBjbG9zZSB0aGUgZmlsZSBzdHJlYW0KLSAgICogcmVxdWlyZWQgZm9yIHRoZSA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+LiAgQmVmb3JlIGNsb3NpbmcsIHRoaXMKLSAgICogbWV0aG9kIGFsc28gd3JpdGVzIHRoZSBmb290ZXIgcG9ydGlvbnMgb2YgdGhlIGZpbGUuICBUaGUgZm9vdGVyIHBvcnRpb25zCi0gICAqIGNvbnNpc3Qgb2YgbGl0dGxlIG1vcmUgdGhhbiBjbG9zaW5nIGJyYWNlcy4KLSAgICoKLSAgICogQHBhcmFtIG1ldGEgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIHBhcnNlZCBub24tcmVzb3VyY2UgZGF0YQotICAgKiAoZS5nLiwgYXV0aG9ycykuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRCdW5kbGUoTWFwIHBhcm1zLCBNYXAgbWV0YSkgdGhyb3dzIFRocm93YWJsZQotICB7Ci0gICAgX3B3LnByaW50bG4oIiAgICB9OyIpOwotICAgIF9wdy5wcmludGxuKCIgIH0iKTsKLSAgICBfcHcucHJpbnRsbigifSIpOwotICAgIF9wdy5jbG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFByaW50V3JpdGVyIGdldE91dCgpCi0gIHsKLSAgICByZXR1cm4gX3B3OwotICB9Ci0KLSAgcHJpdmF0ZSBQcmludFdyaXRlciBfcHc7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1JUU1dyaXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9SVFNXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0YzIxOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1JUU1dyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IGludGVyZmFjZSBkZWZpbmVzIG1ldGhvZHMgZm9yIHdyaXRpbmcgdGhlCi0gKiBoZWFkZXIsIGJvZHksIGFuZCBmb290ZXIgb2YgdmFyaW91cyBvdXRwdXQgaW1wbGVtZW50YXRpb25zLiA8cD4KLSAqCi0gKiBUaGUgbWV0aG9kcyA8Y29kZT5zdGFydEJ1bmRsZTwvY29kZT4gYW5kIDxjb2RlPmVuZEJ1bmRsZTwvY29kZT4gd3JpdGUgdGhlCi0gKiBoZWFkZXIgYW5kIGZvb3RlciBwb3J0aW9ucyB0byB0aGUgb3V0cHV0LiAgVGhlIG1ldGhvZHMgZm9yIHdyaXRpbmcgdGhlCi0gKiBib2R5IGFyZSA8Y29kZT53cml0ZVN0cmluZzwvY29kZT4sIDxjb2RlPndyaXRlU3RyaW5nQXJyYXk8L2NvZGU+LCBhbmQKLSAqIDxjb2RlPndyaXRlTWFwPC9jb2RlPi4gVGhlc2UgbWV0aG9kcyBhcmUgc3VwcGxpZWQgd2l0aCBkYXRhIHBhcnNlZAotICogYnkgdGhlIFhNTC1iYXNlZCBSVFMgZmlsZSA8Y29kZT5YUlRTUGFyc2VyPC9jb2RlPiBvciB0aGUKLSAqIDxjb2RlPlJUU1Byb3BlcnRpZXM8L2NvZGU+IHBhcnNlci48cD4KLSAqCi0gKiBAc2VlIExpc3RSVFNXcml0ZXIKLSAqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbjogMS43ICQpICREYXRlOiAyMDAxLzA0LzA5IDIzOjIyOjIyICQKLSAqLwotcHVibGljIGludGVyZmFjZSBSVFNXcml0ZXIKLXsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSA8ZmlsZSBvciBvdGhlciBvdXRwdXQgaGVhZGVyKHMpLgotICAgKgotICAgKiBAcGFyYW0gcGFybXMgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgotICAgKiBAcGFyYW0gbWV0YSBhIDxjb2RlPk1hcDwvY29kZT4gb2YgcGFyc2VkIG5vbi1yZXNvdXJjZSBkYXRhCi0gICAqIChlLmcuLCBwYWNrYWdlKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0QnVuZGxlKE1hcCBwYXJtcywgTWFwIG1ldGEpCi0gICAgdGhyb3dzIFRocm93YWJsZTsKLQotICAvKioKLSAgICogV3JpdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB0aGUgaW1wbGVtZW50YXRpb24gb3V0cHV0LiA8cD4KLSAgICoKLSAgICogVGhpcyBpcyB0aGUgdHlwaWNhbCBjYXNlIHVzZS4gIEEgc2luZ2xlIDxjb2RlPlN0cmluZzwvY29kZT4ga2V5IGFzc29jaWF0ZWQKLSAgICogd2l0aCBhIHNpbmdsZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIGZvcm1pbmcgYSBrZXkvdmFsdWUgcGFpciAoa3ZwKS4KLSAgICogTm90ZSB0aGF0IHRoZSBvdGhlciB0d28gYm9keSBtZXRob2RzLCA8Y29kZT53cml0ZVN0cmluZ0FycmF5PC9jb2RlPiBhbmQKLSAgICogPGNvZGU+d3JpdGVNYXA8L2NvZGU+IGJvdGggc3VwcG9ydCBhIHNpbmdsZSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAqIGtleSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgdmFsdWVzLiA8cD4KLSAgICoKLSAgICogQSBrZXkvdmFsdWUgcGFpciBtYXkgaGF2ZSBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMgaW4gdGhlIFJUUyBmaWxlLgotICAgKiBJbiB0aGlzIG1ldGhvZCwgdGhlc2UgYXJlIHJlY2VpdmVkIGZyb20gdGhlIFhNTCBwYXJzZXIgYXMgYQotICAgKiA8Y29kZT5NYXA8L2NvZGU+LiA8cD4KLSAgICoKLSAgICogQHBhcmFtIHBhcm1zIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycwotICAgKiBAcGFyYW0gbWV0YSBhIDxjb2RlPk1hcDwvY29kZT4gb2YgcGFyc2VkIG5vbi1yZXNvdXJjZSBkYXRhCi0gICAqIChlLmcuLCBwYWNrYWdlKS4KLSAgICogQHBhcmFtIGtleSBhIDxjb2RlPlN0cmluZzwvY29kZT4ga2V5LgotICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoTWFwIHBhcm1zLCBNYXAgbWV0YSwgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBUaHJvd2FibGU7Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZmlsZSBvciBvdGhlciBvdXRwdXQgZm9vdGVyKHMpLgotICAgKgotICAgKiBAcGFyYW0gcGFybXMgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgotICAgKiBAcGFyYW0gbWV0YSBhIDxjb2RlPk1hcDwvY29kZT4gb2YgcGFyc2VkIG5vbi1yZXNvdXJjZSBkYXRhCi0gICAqIChlLmcuLCBwYWNrYWdlKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEJ1bmRsZShNYXAgcGFybXMsIE1hcCBtZXRhKSB0aHJvd3MgVGhyb3dhYmxlOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1VuaWNvZGVFc2NhcGVzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1VuaWNvZGVFc2NhcGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZTc2YzIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9Vbmljb2RlRXNjYXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi54cnRzOwotCi0vKioKLSAqIFRoZSA8Y29kZT5Vbmljb2RlRXNjYXBlczwvY29kZT4gY2xhc3MgY29udmVydHMgYnl0ZXMgYW5kIGNoYXJhY3RlcnMgb3V0c2lkZQotICogdGhlIEFTQ0lJIGNoYXJhY3RlciBzZXQgdG8gSmF2YSB1c2FibGUgJ1xcdScgVW5pY29kZSBlc2NhcGVzIGNoYXJhY3RlcnMuICBUaGlzCi0gKiBpcyBhIHJ1bnRpbWUgdmVyc2lvbiBvZiBuYXRpdmUyYXNjaWkgbW9yZSBvciBsZXNzLgotICoKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uOiAxLjUgJCkgJERhdGU6IDIwMDIvMDIvMjcgMTc6MTg6MTYgJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5pY29kZUVzY2FwZXMKLXsKLQotICBwcml2YXRlIFVuaWNvZGVFc2NhcGVzKCkKLSAgewotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgY29udmVydChTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0gICAgICBpZiAoYyA8IDEyOCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChjKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxcdCIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxcciIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxcIiIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFx1Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX0hFWFsoYz4+MTIpJiAweDBmXSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX0hFWFsoYz4+OCkmIDB4MGZdKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfSEVYWyhjPj40KSYgMHgwZl0pOwotICAgICAgICBidWZmZXIuYXBwZW5kKF9IRVhbYyAmIDB4MGZdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICB9Ci0KLS8vICBTdHJpbmcgYnl0ZVRvSGV4KGJ5dGUgYikgewotLy8gICAgLy8gUmV0dXJucyBoZXggU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJ5dGUgYgotLy8gICAgY2hhciBoZXhEaWdpdFtdID0gewotLy8gICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCi0vLyAgICAgICAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJwotLy8gICAgfTsKLS8vICAgIGNoYXJbXSBhcnJheSA9IHsgaGV4RGlnaXRbKGIgPj4gNCkgJiAweDBmXSwgaGV4RGlnaXRbYiAmIDB4MGZdIH07Ci0vLyAgICByZXR1cm4gbmV3IFN0cmluZyhhcnJheSk7Ci0vLyAgfQotCi0vLyAgU3RyaW5nIGNoYXJUb0hleChjaGFyIGMpIHsKLS8vICAgIC8vIFJldHVybnMgaGV4IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBjaGFyIGMKLS8vICAgIGJ5dGUgaGkgPSAoYnl0ZSkgKGMgPj4+IDgpOwotLy8gICAgYnl0ZSBsbyA9IChieXRlKSAoYyAmIDB4ZmYpOwotLy8gICAgcmV0dXJuIGJ5dGVUb0hleChoaSkgKyBieXRlVG9IZXgobG8pOwotLy8gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfSEVYID0KLSAgICB7IjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsCi0gICAgICI4IiwgIjkiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYifTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvWFJUU0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTQ1N2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+WFJUU0dlbmVyYXRvcjwvY29kZT4gY2xhc3MgaXMgYSBvbmxpbmUgZmFjaWxpdHkgKGFzIG9wcG9zZWQgdG8gdGhlCi0gKiBjb21tYW5kIGxpbmUgdXRpbGl0eSA8Y29kZT5YUlRTTWFrZUJ1bmRsZTwvY29kZT4pIGZvciBwYXJzaW5nIGFuZCBidWlsZGluZwotICogWE1MLWJhc2VkIFJUUyBmaWxlcyB0byB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24gb3V0cHV0LiA8cD4KLSAqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbjogMS4xICQpICREYXRlOiAyMDAxLzA3LzA5IDE4OjE1OjUzICQKLSAqIEBzaW5jZSBSVFMgMi4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYUlRTR2VuZXJhdG9yCi17Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBYTUwtYmFzZWQgUlRTIHNvdXJjZSBhbmQgY3JlYXRlIG91dHB1dCBhY2NvcmRpbmcgdG8gYW4KLSAgICogPGNvZGU+UlRTV3JpdGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHBhcnNlciBzZWUgY2xhc3MgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBpcyB0aGUgWE1MLWJhc2VkIFJUUyBzb3VyY2UgZmlsZS4KLSAgICogQHBhcmFtIHJ0c3cgYW4gPGNvZGU+UlRTV3JpdGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLSAgICogQHBhcmFtIHBhcm1zIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShTQVhQYXJzZXIgcGFyc2VyLCBJbnB1dFNvdXJjZSBpcywgUlRTV3JpdGVyIHJ0c3csCi0gICAgTWFwIHBhcm1zKSB0aHJvd3MgVGhyb3dhYmxlCi0gIHsKLSAgICBYUlRTUGFyc2VyIHJ0c3AgPSBuZXcgWFJUU1BhcnNlcihydHN3LCBwYXJtcyk7Ci0gICAgcGFyc2VyLnBhcnNlKGlzLCBydHNwKTsKLSAgfQotCi0gIC8vCi0gIC8vIE5vIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcyBjbGFzcwotICAvLwotICBwcml2YXRlIFhSVFNHZW5lcmF0b3IoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvWFJUU1BhcnNlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTBiZjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqICovCi1maW5hbCBjbGFzcyBYUlRTUGFyc2VyIGV4dGVuZHMgSGFuZGxlckJhc2UKLXsKLQotICAvKioKLSAgICogRW1wdHkgY29uc3RydWN0b3IgZm9yIHRoZSBYUlRTUGFyc2VyCi0gICAqCi0gICAqLwotICBwdWJsaWMgWFJUU1BhcnNlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBYUlRTUGFyc2VyKFJUU1dyaXRlciBidywgTWFwIHBhcm1zKQotICB7Ci0gICAgX2J1bmRsZVdyaXRlciA9IGJ3OwotICAgIF9wYXJtcyA9IHBhcm1zOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgYSBMb2NhdG9yIG9iamVjdCBmb3IgZG9jdW1lbnQgZXZlbnRzLgotICAgKiBTZXR0aW5nIExvY2F0b3IgZW5zdXJlcyB0aGUgU0FYIHBhcnNlciBjYW4gZmluZCBhIGdpdmVuIFhNTC1iYXNlZCBSVFMKLSAgICogZG9jdW1lbnQuICBUaGlzIG1ldGhvZCBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIF9maWxlVG9VUkwgaW4KLSAgICogPGNvZGU+WFJUU01ha2VCdW5kbGU8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gbG9jYXRvciBBIGxvY2F0b3IgZm9yIGFsbCBTQVggZG9jdW1lbnQgZXZlbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yIChMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICBfbG9jYXRvciA9IGxvY2F0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIFNBWCBQYXJzZXIgZXZlbnQgZm9yIGZpbmRpbmcgdGhlIGJlZ2lubmluZyBvZiBhbiBYTUwtYmFzZWQgUlRTIGRvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgX21ldGFIdC5wdXQoImZpbGVUeXBlIiwgInhydHMiKTsKLSAgICBfc3RhcnREb2MgPSB0cnVlOwotCi0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIFNBWCBQYXJzZXIgZXZlbnQgZm9yIGZpbmRpbmcgdGhlIGVuZCBvZiBhbiBYTUwtYmFzZWQgUlRTIGRvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmREb2N1bWVudCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIF9idW5kbGVXcml0ZXIuZW5kQnVuZGxlKF9wYXJtcywgX21ldGFIdCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiZW5kQnVuZGxlIEV4Y2VwdGlvbjogIiArIHRoLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgZWxlbWVudCB0eXBlIG5hbWUuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIGF0dHJpYnV0ZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgX25lc3RpbmdMZXZlbCsrOwotCi0gICAgLy8gc3RhcnRCdW5kbGUgZG9lc24ndCBnbyBpbiB0aGUgc3RhcnREb2N1bWVudCBtZXRob2QgYmVjYXVzZSBpdAotICAgIC8vIHJlcXVpcmVzIG1ldGFkYXRhIHRvIGJlIHBhc3NlZCBhbmQgaW4gcGFydGljdWxhciwgcmVxdWlyZXMKLSAgICAvLyBhdCBsZWFzdCB0aGUgcGFja2FnZSBmb3IgYW55IGltcGxlbWVudGF0aW9uIG9mIHN0YXJ0QnVuZGxlIHRvIHdvcmsKLSAgICBpZiAoKF9uZXN0aW5nTGV2ZWwgPT0gMikgJiYgbmFtZS5lcXVhbHMoInJlc291cmNlIikpCi0gICAgewotICAgICAgaWYgKF9zdGFydERvYykKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBfYnVuZGxlV3JpdGVyLnN0YXJ0QnVuZGxlKF9wYXJtcywgX21ldGFIdCk7Ci0gICAgICAgICAgX3N0YXJ0RG9jID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oInN0YXJ0QnVuZGxlIEV4Y2VwdGlvbjogIiArIHRoLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgX2N1cnJlbnRSZXNvdXJjZUtleSA9IGF0dHMuZ2V0VmFsdWUoImtleSIpOwotICAgICAgaWYgKF91bmlxS2V5cy5jb250YWlucyhfY3VycmVudFJlc291cmNlS2V5KSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEdXBsaWNhdGUgaWQgXCIiICsgX2N1cnJlbnRSZXNvdXJjZUtleSArICJcIiIpOwotICAgICAgfQotCi0gICAgICBfdW5pcUtleXMuYWRkKF9jdXJyZW50UmVzb3VyY2VLZXkpOwotICAgICAgCi0KLSAgICAgIF9jdXJyZW50UmVzb3VyY2VWYWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChfbmVzdGluZ0xldmVsID09IDEpICYmIG5hbWUuZXF1YWxzKCJyZXNvdXJjZXMiKSkKLSAgICB7Ci0gICAgICBfbWV0YUh0LnB1dCgicGFja2FnZSIsIGF0dHMuZ2V0VmFsdWUoInBhY2thZ2UiKSk7Ci0gICAgICBpZiAoYXR0cy5nZXRWYWx1ZSgidmVyc2lvbiIpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIF9tZXRhSHQucHV0KCJ2ZXJzaW9uIiwgYXR0cy5nZXRWYWx1ZSgidmVyc2lvbiIpKTsKLSAgICAgIH0KLSAgICAgIGlmIChhdHRzLmdldFZhbHVlKCJiYXNldmVyc2lvbiIpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIF9tZXRhSHQucHV0KCJiYXNlVmVyc2lvbiIsIGF0dHMuZ2V0VmFsdWUoImJhc2V2ZXJzaW9uIikpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBlbGVtZW50IHR5cGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmICgoX25lc3RpbmdMZXZlbCA9PSAyKSAmJiBuYW1lLmVxdWFscygicmVzb3VyY2UiKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBfY3VycmVudFJlc291cmNlVmFsdWUudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgX2J1bmRsZVdyaXRlci53cml0ZVN0cmluZyhfcGFybXMsIF9tZXRhSHQsIF9jdXJyZW50UmVzb3VyY2VLZXksIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX25lc3RpbmdMZXZlbC0tOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIGluIGVsZW1lbnQgY29udGVudC4KLSAgICoKLSAgICogQHBhcmFtIGNoIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdIGNidWYsIGludCBzdGFydCwgaW50IGxlbikKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWdub3JhYmxlV2hpdGVTcGFjZSIgKyBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYXJhY3RlciBkYXRhIGluc2lkZSBhbiBlbGVtZW50LgotICAgKgotICAgKiBAcGFyYW0gY2ggdGhlIGNoYXJhY3RlcnMuCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNidWYsIGludCBzdGFydCwgaW50IGxlbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKF9uZXN0aW5nTGV2ZWwgPT0gMikKLSAgICB7Ci0gICAgICBfY3VycmVudFJlc291cmNlVmFsdWUuYXBwZW5kKGNidWYsIHN0YXJ0LCBsZW4pOwotICAgIH0KLSAgfQotCi0KLSAgLy8gU3RvcmUgdGhlIGxvY2F0b3IKLSAgcHJpdmF0ZSBMb2NhdG9yIF9sb2NhdG9yOwotCi0gIHByaXZhdGUgU3RyaW5nIF9jdXJyZW50UmVzb3VyY2VLZXk7Ci0gIHByaXZhdGUgU3RyaW5nQnVpbGRlciBfY3VycmVudFJlc291cmNlVmFsdWU7Ci0gIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBfbWV0YUh0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gIHByaXZhdGUgU2V0PFN0cmluZz4gX3VuaXFLZXlzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gIHByaXZhdGUgUlRTV3JpdGVyIF9idW5kbGVXcml0ZXI7Ci0gIHByaXZhdGUgTWFwIF9wYXJtczsKLQotICBwcml2YXRlIGludCBfbmVzdGluZ0xldmVsID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIF9zdGFydERvYyA9IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODM3OWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotICAtIEEgIm1vZHVsZSIgcG9tIHdob3NlIHB1cnBvc2UgaXMgc2ltcGx5IHRvIGJ1aWxkIGFsbCBtYXZlbiBtb2R1bGVzCi0gIC0gaW4gdGhlIHN1YmRpcmVjdG9yaWVzLiBUaGlzIGlzIE5PVCB0aGUgcGFyZW50IHBvbSBvZiBhbnkgcHJvamVjdCwKLSAgLSBhbmQgaXMgbm90IGV4cGVjdGVkIHRvIGV2ZXIgYmUgcmVsZWFzZWQuCi0gIC0tPgotCi08cHJvamVjdAotICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLW1vZHVsZTwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgUGx1Z2luIE1vZHVsZTwvbmFtZT4KLSAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL3BsdWdpbnM8L3VybD4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWZhY2VzLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1pMThuLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1qYXZhY2MtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWpkZXYtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLXRhZ2RvYy1wbHVnaW48L21vZHVsZT4KLSAgICA8bW9kdWxlPm15ZmFjZXMtd2Fnb24tcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLXhydHMtcGx1Z2luPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvTElDRU5TRS50eHQgYi9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTElDRU5TRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1hcmNoZXR5cGVzL0xJQ0VOU0UudHh0CnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTElDRU5TRS50eHQKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL05PVElDRS50eHQgYi9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTk9USUNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLWFyY2hldHlwZXMvTk9USUNFLnR4dApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL05PVElDRS50eHQKZGlmZiAtLWdpdCBhL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9wb20ueG1sIGIvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YjExOAotLS0gL2Rldi9udWxsCisrKyBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9wb20ueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPiAKKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXBsdWdpbi1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+IAorICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgQnVpbGRlciBBbm5vdGF0aW9uczwvbmFtZT4KKworICA8ZGVzY3JpcHRpb24+CisgICAgQSBzZXQgb2YgSmF2YSAxLjUgQW5ub3RhdGlvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3NlcyB0aGF0IGFyZQorICAgIGludGVuZGVkIHRvIGJlIEpTRiBjb21wb25lbnRzLCB2YWxpZGF0b3JzLCBldGMuIFRoZSBtYXZlbi1idWlsZGVyLXBsdWdpbiB3aWxsCisgICAgcmVjb2duaXNlIHRoZXNlIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIHRoZSBjbGFzcyBhcHByb3ByaWF0ZWx5LgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CisgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8cmVwb3J0aW5nPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9yZXBvcnRpbmc+CisKKworICA8c2NtPgorICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdGFncy9sdTQyNDJfbTJfcGx1Z2luc18xMDFfcmVsZWFzZS9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnM8L2Nvbm5lY3Rpb24+CisgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvYnJhbmNoZXMvbHU0MjQyX20yX3BsdWdpbnNfMTAxX3JlbGVhc2UvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdGFncy9sdTQyNDJfbTJfcGx1Z2luc18xMDFfcmVsZWFzZS9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnM8L3VybD4KKyAgPC9zY20+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ29tcG9uZW50LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDb21wb25lbnQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ29tcG9uZW50LmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNvbXBvbmVudC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDb252ZXJ0ZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNvbnZlcnRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDb252ZXJ0ZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ29udmVydGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkV4Y2x1ZGUuamF2YSBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkV4Y2x1ZGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRXhjbHVkZS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZFeGNsdWRlLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2V0LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNldC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNldC5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNldC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BBdHRyaWJ1dGUuamF2YSBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcEF0dHJpYnV0ZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BBdHRyaWJ1dGUuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwQXR0cmlidXRlLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFByb3BlcnRpZXMuamF2YSBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFByb3BlcnRpZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwUHJvcGVydGllcy5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BQcm9wZXJ0aWVzLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFByb3BlcnR5LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BQcm9wZXJ0eS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BQcm9wZXJ0eS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BQcm9wZXJ0eS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BUYWcuamF2YSBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFRhZy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BUYWcuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwVGFnLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlByb3BlcnR5LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZQcm9wZXJ0eS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZQcm9wZXJ0eS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZQcm9wZXJ0eS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJLaXQuamF2YSBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlJlbmRlcktpdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJLaXQuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUmVuZGVyS2l0LmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlJlbmRlcmVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZWYWxpZGF0b3IuamF2YSBiL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlZhbGlkYXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZWYWxpZGF0b3IuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGVmFsaWRhdG9yLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vTElDRU5TRS50eHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL0xJQ0VOU0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL0xJQ0VOU0UudHh0CnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL0xJQ0VOU0UudHh0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL05PVElDRS50eHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL05PVElDRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vTk9USUNFLnR4dApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9OT1RJQ0UudHh0CmRpZmYgLS1naXQgYS9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3BvbS54bWwgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwZjk3OQotLS0gL2Rldi9udWxsCisrKyBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vcG9tLnhtbApAQCAtMCwwICsxLDE3NSBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+IAorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPm15ZmFjZXMtYnVpbGRlci1wbHVnaW48L2FydGlmYWN0SWQ+IAorICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KKyAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgQnVpbGRlciBQbHVnaW48L25hbWU+CisgIDxkZXNjcmlwdGlvbj4KKyAgICBBIG1hdmVuIHBsdWdpbiB0aGF0IHVzZXMgYW5ub3RhdGlvbnMgKGphdmExNSBvciBkb2NsZXQgc3R5bGUpIHRvIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkgSlNGIGNvbmZpZ3VyYXRpb24KKyAgICBmaWxlcyAoLnRsZCwgZmFjZXMtY29uZmlnLnhtbCwgZXRjKSBhbmQgb3B0aW9uYWxseSBUYWcsIFZhbGlkYXRvciBhbmQgQ29tcG9uZW50IGNsYXNzZXMuCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPCEtLSByZXF1aXJlZCBmb3IgcGxleHVzLCBidXQgd2UgYXJlIG5vdCB1c2luZyB0aGlzIHJpZ2h0IG5vdworICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGdvYWxQcmVmaXg+bXlmYWNlcy1idWlsZGVyPC9nb2FsUHJlZml4PgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgICAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CisgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuNDwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS40PC90YXJnZXQ+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8cmVwb3J0aW5nPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvcmVwb3J0aW5nPgorICAKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIAorICAgIDxkZXBlbmRlbmN5PiAgICAKKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4gICAKKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy5xZG94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cWRveDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNi4zPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjg8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgCTxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPgorICAgIAk8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4KKyAgICAJPHZlcnNpb24+MS4wLmIyPC92ZXJzaW9uPgorICAgIAk8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5zYXhvbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNheG9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Ni41LjM8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuNi4yPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgIAk8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgorICAgIAk8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAJPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+CisgICAgCTwhLS0gPHNjb3BlPmNvbXBpbGU8L3Njb3BlPiAgLS0+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgCTxncm91cElkPnN0YXg8L2dyb3VwSWQ+CisgICAgCTxhcnRpZmFjdElkPnN0YXg8L2FydGlmYWN0SWQ+CisgICAgCTx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIAk8IS0tIDxzY29wZT5ydW50aW1lPC9zY29wZT4gIC0tPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+dmVsb2NpdHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD52ZWxvY2l0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8IS0tICAgICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdmVsb2NpdHk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEuNzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgIC0tPgorICAgIAorICAgIDwhLS0gUmVwb3J0aW5nIHJlcXVpcmVkIEFQSS0tPiAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5yZXBvcnRpbmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uZG94aWE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5kb3hpYS1zaXRlLXJlbmRlcmVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTc8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDwhLS0gRW5kIFJlcG9ydGluZyByZXF1aXJlZCBBUEkgLS0+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMTM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworCisgIDxzY20+CisgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90YWdzL2x1NDI0Ml9tMl9wbHVnaW5zXzEwMV9yZWxlYXNlL215ZmFjZXMtYnVpbGRlci1wbHVnaW48L2Nvbm5lY3Rpb24+CisgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvYnJhbmNoZXMvbHU0MjQyX20yX3BsdWdpbnNfMTAxX3JlbGVhc2UvbXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RhZ3MvbHU0MjQyX20yX3BsdWdpbnNfMTAxX3JlbGVhc2UvbXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvdXJsPgorICA8L3NjbT4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0J1aWxkTWV0YURhdGFNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0J1aWxkTWV0YURhdGFNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvQnVpbGRNZXRhRGF0YU1vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0ZsYXR0ZW5lci5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9GbGF0dGVuZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9GbGF0dGVuZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9GbGF0dGVuZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvSU9VdGlscy5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb21wb25lbnRzTW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29uZmlnTW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29uZmlnTW9qby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb25maWdNb2pvLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbmZpZ01vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29udmVydGVyVGFnc01vam8uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbnZlcnRlclRhZ3NNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbnZlcnRlclRhZ3NNb2pvLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbnZlcnRlclRhZ3NNb2pvLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVRhZ3NNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VUYWdzTW9qby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VUYWdzTW9qby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VUYWdzTW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VWYWxpZGF0b3JUYWdzTW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVmFsaWRhdG9yVGFnc01vam8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVmFsaWRhdG9yVGFnc01vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVmFsaWRhdG9yVGFnc01vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVmFsaWRhdG9yc01vam8uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvcnNNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvcnNNb2pvLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvcnNNb2pvLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTW9kZWxCdWlsZGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01vZGVsQnVpbGRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01vZGVsQnVpbGRlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01vZGVsQnVpbGRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2lvL1ByZXR0eVdyaXRlci5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9pby9QcmV0dHlXcml0ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9pby9QcmV0dHlXcml0ZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9pby9QcmV0dHlXcml0ZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9pby9YbWxXcml0ZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vWG1sV3JpdGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vWG1sV3JpdGVyLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vWG1sV3JpdGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQXR0cmlidXRlSG9sZGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZUhvbGRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZUhvbGRlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZUhvbGRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZU1ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQXR0cmlidXRlTWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZU1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ2xhc3NNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NsYXNzTWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NsYXNzTWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NsYXNzTWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbXBvbmVudE1ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ29tcG9uZW50TWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbXBvbmVudE1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Db21wb25lbnRNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ29udmVydGVyTWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Db252ZXJ0ZXJNZXRhLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ29udmVydGVyTWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbnZlcnRlck1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9GYWNldEhvbGRlci5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9GYWNldEhvbGRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0SG9sZGVyLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRIb2xkZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9GYWNldE1ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRNZXRhLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTWV0aG9kU2lnbmF0dXJlTWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9NZXRob2RTaWduYXR1cmVNZXRhLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTWV0aG9kU2lnbmF0dXJlTWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01ldGhvZFNpZ25hdHVyZU1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Nb2RlbC5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Nb2RlbC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWwuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Nb2RlbFV0aWxzLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsVXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Nb2RlbFV0aWxzLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWxVdGlscy5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5SG9sZGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5SG9sZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUHJvcGVydHlIb2xkZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Qcm9wZXJ0eUhvbGRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5TWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Qcm9wZXJ0eU1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Qcm9wZXJ0eU1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Qcm9wZXJ0eU1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJLaXRNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1JlbmRlcktpdE1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJLaXRNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUmVuZGVyS2l0TWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1JlbmRlcmVyTWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJlck1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJlck1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJlck1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9UYWdNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1RhZ01ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9UYWdNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVGFnTWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1ZhbGlkYXRvck1ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVmFsaWRhdG9yTWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1ZhbGlkYXRvck1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WYWxpZGF0b3JNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVmlld0VudGl0eU1ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVmlld0VudGl0eU1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WaWV3RW50aXR5TWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1ZpZXdFbnRpdHlNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdERlcGVuZGVuY3lNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdERlcGVuZGVuY3lNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL0Fic3RyYWN0RGVwZW5kZW5jeU1vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3REZXBlbmRlbmN5TW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdEZyb21Db25maWd1cmF0aW9uTW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3RGcm9tQ29uZmlndXJhdGlvbk1vam8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3RGcm9tQ29uZmlndXJhdGlvbk1vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3RGcm9tQ29uZmlndXJhdGlvbk1vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQXJ0aWZhY3RJdGVtLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BcnRpZmFjdEl0ZW0uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQXJ0aWZhY3RJdGVtLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL0FydGlmYWN0SXRlbS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9VbnBhY2tNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9VbnBhY2tNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL1VucGFja01vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svVW5wYWNrTW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0J1aWxkRXhjZXB0aW9uLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0J1aWxkRXhjZXB0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvQnVpbGRFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9CdWlsZEV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0NvbnNvbGVMb2dTeXN0ZW0uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvQ29uc29sZUxvZ1N5c3RlbS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0NvbnNvbGVMb2dTeXN0ZW0uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9Db25zb2xlTG9nU3lzdGVtLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvTXlmYWNlc1V0aWxzLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL1JlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL1JlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9SZWxhdGl2ZUNsYXNzcGF0aFJlc291cmNlTG9hZGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NDb250ZW50TW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0NvbnRlbnRNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NDb250ZW50TW9qby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jQ29udGVudE1vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0luZGV4UmVwb3J0LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jSW5kZXhSZXBvcnQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0luZGV4UmVwb3J0LmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NJbmRleFJlcG9ydC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jVXRpbHMuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jVXRpbHMuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1V0aWxzLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTEudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczExLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczExLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczExLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzc01hY3JvczExLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3NNYWNyb3MxMS52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3NNYWNyb3MxMS52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3NNYWNyb3MxMS52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTEudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcxMS52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTEudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZzExLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWZhY2VzX2h0bWwudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWZhY2VzX2h0bWwudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215ZmFjZXNfaHRtbC52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXlmYWNlc19odG1sLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczExLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMS52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMS52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMS52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3NNYWNyb3MxMS52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzTWFjcm9zMTEudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzTWFjcm9zMTEudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzTWFjcm9zMTEudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3ZhbGlkYXRvckNsYXNzMTEudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczExLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczExLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczExLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzc01hY3JvczExLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3NNYWNyb3MxMS52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3NNYWNyb3MxMS52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3NNYWNyb3MxMS52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb21wb25lbnQudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbXBvbmVudC52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb21wb25lbnQudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtY29tcG9uZW50LnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbnZlcnRlci52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtY29udmVydGVyLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbnZlcnRlci52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb252ZXJ0ZXIudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtdGFnLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy10YWcudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtdGFnLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXRhZy52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy12YWxpZGF0b3Iudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXZhbGlkYXRvci52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy12YWxpZGF0b3Iudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtdmFsaWRhdG9yLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94bWxNYWNyb3Mudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94bWxNYWNyb3Mudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3htbE1hY3Jvcy52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveG1sTWFjcm9zLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qb1Rlc3QuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvQnVpbGRNZXRhRGF0YU1vam9UZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvQnVpbGRNZXRhRGF0YU1vam9UZXN0LmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvQnVpbGRNZXRhRGF0YU1vam9UZXN0LmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyVGVzdC5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9GbGF0dGVuZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyVGVzdC5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0ZsYXR0ZW5lclRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzVGVzdC5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHNUZXN0LmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvSU9VdGlsc1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam9UZXN0LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb21wb25lbnRzTW9qb1Rlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam9UZXN0LmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbXBvbmVudHNNb2pvVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlclRlc3QuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlclRlc3QuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L1Fkb3hNb2RlbEJ1aWxkZXJUZXN0LmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRCYXNlLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50QmFzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50QmFzZS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50QmFzZS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50Q2hpbGQuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRDaGlsZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50Q2hpbGQuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudENoaWxkLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRJbnRlcmZhY2UuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRJbnRlcmZhY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudEludGVyZmFjZS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db252ZXJ0ZXIxLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29udmVydGVyMS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29udmVydGVyMS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29udmVydGVyMS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvVmFsaWRhdG9yMS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L1ZhbGlkYXRvcjEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L1ZhbGlkYXRvcjEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L1ZhbGlkYXRvcjEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L2dvb2RmaWxlLWZsYXQueG1sIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L2dvb2RmaWxlLWZsYXQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUtZmxhdC54bWwKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS1mbGF0LnhtbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L2dvb2RmaWxlLnhtbCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS54bWwKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS54bWwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS1mbGF0LnhtbCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS1mbGF0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL2dvb2RmaWxlLWZsYXQueG1sCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUtZmxhdC54bWwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUueG1sCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUueG1sCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRCYXNlLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRCYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEJhc2UuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50QmFzZS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5TdWJjbGFzcy5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuU3ViY2xhc3MuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuU3ViY2xhc3MuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuU3ViY2xhc3MuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuVGVtcGxhdGUuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEdlblRlbXBsYXRlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEdlblRlbXBsYXRlLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEdlblRlbXBsYXRlLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEludGVyZmFjZS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEludGVyZmFjZS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRJbnRlcmZhY2UuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50TWFudWFsLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRNYW51YWwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50TWFudWFsLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudE1hbnVhbC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9Gb28uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlL0Zvby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9Gb28uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUvRm9vLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlL2dvb2RmaWxlLnhtbCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlL2dvb2RmaWxlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUvZ29vZGZpbGUueG1sCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9nb29kZmlsZS54bWwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvRm9vLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZTE1L0Zvby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZTE1L0Zvby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZTE1L0Zvby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZTE1L2dvb2RmaWxlLnhtbCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvZ29vZGZpbGUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZTE1L2dvb2RmaWxlLnhtbApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUxNS9nb29kZmlsZS54bWwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9MSUNFTlNFLnR4dCBiL215ZmFjZXMtcGx1Z2luLXBhcmVudC9MSUNFTlNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L0xJQ0VOU0UudHh0CnJlbmFtZSB0byBteWZhY2VzLXBsdWdpbi1wYXJlbnQvTElDRU5TRS50eHQKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9OT1RJQ0UudHh0IGIvbXlmYWNlcy1wbHVnaW4tcGFyZW50L05PVElDRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9OT1RJQ0UudHh0CnJlbmFtZSB0byBteWZhY2VzLXBsdWdpbi1wYXJlbnQvTk9USUNFLnR4dApkaWZmIC0tZ2l0IGEvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3BvbS54bWwgYi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGM4NzcxCi0tLSAvZGV2L251bGwKKysrIGIvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3BvbS54bWwKQEAgLTAsMCArMSwyMjQgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgUGx1Z2luIFBhcmVudDwvbmFtZT4KKyAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL3BsdWdpbnM8L3VybD4KKworICA8aXNzdWVNYW5hZ2VtZW50PgorICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPgorICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01ZRkFDRVM8L3VybD4KKyAgPC9pc3N1ZU1hbmFnZW1lbnQ+CisKKyAgPGNpTWFuYWdlbWVudD4KKyAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgorICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPgorICAgIDxub3RpZmllcnM+CisgICAgICA8bm90aWZpZXI+CisgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+CisgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L25vdGlmaWVyPgorICAgIDwvbm90aWZpZXJzPgorICA8L2NpTWFuYWdlbWVudD4KKworICA8aW5jZXB0aW9uWWVhcj4yMDAxPC9pbmNlcHRpb25ZZWFyPgorCisgIDxidWlsZD4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKworICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgPHBsdWdpbnM+CisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgIDwvcGx1Z2lucz4KKyAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisKKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDwhLS0KKyAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAorICAgICAgICAgIC0gaW4gdGhlIC1qYXZhZG9jIGphciBmaWxlIGZvciB0aGUgY29tcG9uZW50LgorICAgICAgICAgIC0tPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+CisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgICAgICAgIDwvdGFza3M+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPCEtLQorICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCisgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCisgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCisgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCisgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KKyAgICAgICAgICAtLT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPnZlcmlmeS1zdHlsZTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz48Z29hbD5jaGVjazwvZ29hbD48L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+CisgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXItc3BhY2VzLnR4dDwvaGVhZGVyTG9jYXRpb24+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8cmVwb3J0aW5nPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8cnVsZXNldHM+CisgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgorICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgorICAgICAgICAgIDwvcnVsZXNldHM+CisgICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgorICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KKyAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtbm9ybWFsLnhtbDwvY29uZmlnTG9jYXRpb24+CisgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXItc3BhY2VzLnR4dDwvaGVhZGVyTG9jYXRpb24+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9yZXBvcnRpbmc+CisKKyAgPHNjbT4KKyAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL2JyYW5jaGVzL2x1NDI0Ml9tMl9wbHVnaW5zXzEwMV9yZWxlYXNlL215ZmFjZXMtcGx1Z2luLXBhcmVudDwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy9icmFuY2hlcy9sdTQyNDJfbTJfcGx1Z2luc18xMDFfcmVsZWFzZS9teWZhY2VzLXBsdWdpbi1wYXJlbnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy9icmFuY2hlcy9sdTQyNDJfbTJfcGx1Z2luc18xMDFfcmVsZWFzZS9teWZhY2VzLXBsdWdpbi1wYXJlbnQ8L3VybD4KKyAgPC9zY20+CisKKyAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KKyAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgorICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgorICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+CisgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KKyAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KKyAgICA8c2l0ZT4KKyAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+CisgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2luczwvdXJsPgorICAgIDwvc2l0ZT4KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorCisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgIDwhLS0KKyAgICAgIE5PVEU6IEV4ZWN1dGUgdGhpcyBwcm9maWxlIGxpa2UKKyAgICAgICAgICAgIG12biBjbGVhbiBzb3VyY2U6amFyIGluc3RhbGwgZGVwbG95IC1EYWx0RGVwbG95bWVudFJlcG9zaXRvcnk9bWF0emV3OjpkZWZhdWx0OjpmaWxlOi8vRk9MREVSIC1QcmVsZWFzZQorICAgICAgIC0tPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS00PC92ZXJzaW9uPgorICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KKyAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2NtLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGlkPmdldHRpbmctc2NtLnJldmlzaW9uPC9pZD4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD51cGRhdGU8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CnJlbmFtZSB0byBteWZhY2VzLXBsdWdpbi1wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9MSUNFTlNFLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9OT1RJQ0UudHh0IGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI0YTFmLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvcG9tLnhtbCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxMzhmMy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPCEtLQotICAgICAgLSBOb3RlIHRoYXQgdGhpcyBwYXJlbnQgZGVjbGFyYXRpb24gaXMgYSBsaXR0bGUgd2VpcmQ7IHRoZSBjaGVja3N0eWxlIHBsdWdpbiBjb25maWd1cmF0aW9uIGluCi0gICAgICAtIHRoZSBwYXJlbnQgcG9tIHJlZmVyZW5jZXMgdGhpcyBhcnRpZmFjdC4gUG9zc2libHkgdGhlIHBhcmVudCBwb20gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50bwotICAgICAgLSB0d28gcGFydHM7IHRoZSBiaXRzIHdlIHdhbnQgdG8gaW5oZXJpdCBoZXJlIChkaXN0cmlidXRpb25NYW5hZ2VtZW50LCBtYWlsaW5nTGlzdHMgZXRjKSBhbmQKLSAgICAgIC0gYSBzZXBhcmF0ZSBwb20gdGhhdCByZWZlcmVuY2VzIHRoaXMgYXJ0aWZhY3QuIEhvd2V2ZXIgdGhpcyB3b3JrcyBmb3Igbm93LgotICAgICAgLS0+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNoZWNrc3R5bGUtcnVsZXM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPmNoZWNrc3R5bGUtcnVsZXM8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLQotICA8YnVpbGQ+Ci0gICAgPHJlc291cmNlcz4KLSAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0gIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWwgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLW1pbmltYWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQxMDVkLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAtLT4KLQotPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKLSAgICAiLS8vUHVwcHkgQ3Jhd2wvL0RURCBDaGVjayBDb25maWd1cmF0aW9uIDEuMS8vRU4iCi0gICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMS5kdGQiPgotCi08IS0tCi0gIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyB0aGUgbWF2ZW4gY29kaW5nIGNvbnZlbnRpb25zLgotICBUaGlzIGNoZWNrcyB0aGUgYWJzb2x1dGUgbWluaW11bSwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yCi0gIHByb2plY3RzIHRoYXQgaGF2ZSByZWFsbHkgdWdseSBleGlzdGluZyBjb2RlIGFuZCBhcmUgbm90IHdvcnRoCi0gIGZpeGluZyB1cC4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgotCi0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYWNoZUZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuY2FjaGUuZmlsZX0iLz4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl8/W0EtWl1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iSGVhZGVyIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmhlYWRlci5maWxlfSIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iVXBwZXJFbGwiLz4KLQotICAgIDwvbW9kdWxlPgotCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OGJkNmIuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gLS0+Ci0KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjEvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzEuZHRkIj4KLQotPCEtLQotICBDaGVja3N0eWxlIGNvbmZpZ3VyYXRpb24gdGhhdCBjaGVja3MgdGhlIG1hdmVuIGNvZGluZyBjb252ZW50aW9ucy4KLS0tPgotCi08bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBhIHBhY2thZ2UuaHRtbCBmaWxlIGV4aXN0cyBmb3IgZWFjaCBwYWNrYWdlLiAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwjUGFja2FnZUh0bWwgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iUGFja2FnZUh0bWwiLyAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNOZXdsaW5lQXRFbmRPZkZpbGUgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iTmV3bGluZUF0RW5kT2ZGaWxlIi8gLS0+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IHByb3BlcnR5IGZpbGVzIGNvbnRhaW4gdGhlIHNhbWUga2V5cy4gICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNUcmFuc2xhdGlvbiAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvIC0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJKYXZhZG9jTWV0aG9kIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NUeXBlIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvIC0tPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIE5hbWluZyBDb252ZW50aW9ucy4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLTwhLS0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZW1iZXJOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl9bYS16XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0tLT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSI+Ci0gICAgICAgICAgPCEtLSBOb3JtYWwgcnVsZXMsIGV4Y2VwdCB0aGF0OgotICAgICAgICAgICAgIC0gICogYW55IG5hbWUgY2FuIHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZS4KLSAgICAgICAgICAgICAtICAqICJsb2ciIGlzIGFsbG93ZWQ7IHRoaXMgaXMgYSB0cmFkaXRpb25hbCBuYW1lIGZvciBsb2cgb2JqZWN0cwotICAgICAgICAgICAgIC0gICogbmFtZXMgZW5kaW5nIHdpdGggIlRocmVhZExvY2FsIiBhcmUgYWxsb3dlZCBzbyB0aGF0IHRocmVhZGxvY2FsIHZhcnMgZG9uJ3QgaGF2ZSB0byBiZQotICAgICAgICAgICAgIC0gICAgYWxsLWNhcHMuIFRoZXkgYXJlIHN0YXRpYyBmaW5hbCwgYnV0IGFyZSBub3QgcmVhbGx5IGNvbnN0YW50cy4gWWVzLCB0eXBlIHByZWZpeGVzCi0gICAgICAgICAgICAgLSAgICBvbiB2YXJpYWJsZSBuYW1lcyBzdWNrcyAoImh1bmdhcmlhbiBub3RhdGlvbiIpIGJ1dCBjaGVja3N0eWxlIGRvZXNuJ3QgYWxsb3cgCi0gICAgICAgICAgICAgLSAgICBuYW1lIHJ1bGVzIHRvIHZhcnkgYnkgdGhlIHR5cGUgb2YgdGhlIGNvbnN0YW50LCBhbmQgbm8gb3RoZXIgYWx0ZXJuYXRpdmUgc2VlbXMKLSAgICAgICAgICAgICAtICAgIGFueSBiZXR0ZXIuCi0gICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgCi0gICAgICAgICAgICAgdmFsdWU9Il5fPygobG9nKXwoW2Etel1bYS16QS1aXSpUaHJlYWRMb2NhbCl8KFtBLVpdW0EtWjAtOV0qKF9bQS1aMC05XSspKikpJCIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTmFtZSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5fP1thLXpdW2EtekEtWjAtOV0qJCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsRmluYWxWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3RhdGljVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXz9bQS1aXVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgSGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2hlYWRlci5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhlYWRlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5oZWFkZXIuZmlsZX0iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2ltcG9ydC5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVbnVzZWRJbXBvcnRzIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfc2l6ZXMuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjEyMCIgLz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlUGF0dGVybiIgdmFsdWU9IkB2ZXJzaW9ufEBzZWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMjAwIiAvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOdW1iZXIiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMCIgLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ193aGl0ZXNwYWNlLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVGFiQ2hhcmFjdGVyIi8+Ci0KLSAgICAgICAgPCEtLSBNb2RpZmllciBDaGVja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19tb2RpZmllcnMuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRNb2RpZmllciIvIC0tPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBibG9ja3MuIFlvdSBrbm93LCB0aG9zZSB7fSdzICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfYmxvY2tzLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siLyAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOZWVkQnJhY2VzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ij4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0ibmwiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9ImFsb25lIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjb21tb24gY29kaW5nIHByb2JsZW1zICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRG91YmxlQ2hlY2tlZExvY2tpbmciLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVxdWFsc0hhc2hDb2RlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRGVmYXVsdENvbWVzTGFzdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmFsbFRocm91Z2giLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zIi8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNsYXNzIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRGVzaWduRm9yRXh0ZW5zaW9uIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkZpbmFsQ2xhc3MiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiLyAtLT4KLQotCi0gICAgICAgIDwhLS0gTWlzY2VsbGFuZW91cyBvdGhlciBjaGVja3MuICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8gLS0+Ci0gICAgICAgIDwhLS0gTGluZSB3aXRoIFRyYWlsaW5nIFNwYWNlcyAoZGlzYWJsZWQgYXMgaXQncyB0byBub2lzeSkKLSAgICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXHMrJCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJMaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAgIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0KLSAgICA8L21vZHVsZT4KLQotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0cmljdC54bWwgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0cmljdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTZhNWUuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdHJpY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIC0tPgotCi08IURPQ1RZUEUgbW9kdWxlIFBVQkxJQwotICAgICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4xLy9FTiIKLSAgICAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL2NvbmZpZ3VyYXRpb25fMV8xLmR0ZCI+Ci0KLTwhLS0KLSAgQ2hlY2tzdHlsZSBjb25maWd1cmF0aW9uIHRoYXQgY2hlY2tzIHRoZSBtYXZlbiBjb2RpbmcgY29udmVudGlvbnMuCi0gIFRoaXMgZW5mb3JjZXMgc3RyaWN0ZXIgcXVhbGl0eSBjaGVja3MgdGhhbiB0aGUgIm15ZmFjZXMtY2hlY2tzLnhtbCIKLSAgZmlsZSBkb2VzLiBJZGVhbGx5IHRoaXMgd291bGQgYmUgdXNlZCBldmVyeXdoZXJlLCBidXQuLi4KLS0tPgotCi08bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBhIHBhY2thZ2UuaHRtbCBmaWxlIGV4aXN0cyBmb3IgZWFjaCBwYWNrYWdlLiAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwjUGFja2FnZUh0bWwgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iUGFja2FnZUh0bWwiLyAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNOZXdsaW5lQXRFbmRPZkZpbGUgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iTmV3bGluZUF0RW5kT2ZGaWxlIi8gLS0+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IHByb3BlcnR5IGZpbGVzIGNvbnRhaW4gdGhlIHNhbWUga2V5cy4gICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNUcmFuc2xhdGlvbiAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvIC0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJKYXZhZG9jTWV0aG9kIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NUeXBlIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvIC0tPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIE5hbWluZyBDb252ZW50aW9ucy4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZW1iZXJOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl9bYS16XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb25zdGFudE5hbWUiPgotICAgICAgICAgIDwhLS0gTm9ybWFsIHJ1bGVzLCBleGNlcHQgdGhhdDoKLSAgICAgICAgICAgICAtICAqIGFueSBuYW1lIGNhbiBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUuCi0gICAgICAgICAgICAgLSAgKiAibG9nIiBpcyBhbGxvd2VkOyB0aGlzIGlzIGEgdHJhZGl0aW9uYWwgbmFtZSBmb3IgbG9nIG9iamVjdHMKLSAgICAgICAgICAgICAtICAqIG5hbWVzIGVuZGluZyB3aXRoICJUaHJlYWRMb2NhbCIgYXJlIGFsbG93ZWQgc28gdGhhdCB0aHJlYWRsb2NhbCB2YXJzIGRvbid0IGhhdmUgdG8gYmUKLSAgICAgICAgICAgICAtICAgIGFsbC1jYXBzLiBUaGV5IGFyZSBzdGF0aWMgZmluYWwsIGJ1dCBhcmUgbm90IHJlYWxseSBjb25zdGFudHMuIFllcywgdHlwZSBwcmVmaXhlcwotICAgICAgICAgICAgIC0gICAgb24gdmFyaWFibGUgbmFtZXMgc3Vja3MgKCJodW5nYXJpYW4gbm90YXRpb24iKSBidXQgY2hlY2tzdHlsZSBkb2Vzbid0IGFsbG93IAotICAgICAgICAgICAgIC0gICAgbmFtZSBydWxlcyB0byB2YXJ5IGJ5IHRoZSB0eXBlIG9mIHRoZSBjb25zdGFudCwgYW5kIG5vIG90aGVyIGFsdGVybmF0aXZlIHNlZW1zCi0gICAgICAgICAgICAgLSAgICBhbnkgYmV0dGVyLgotICAgICAgICAgICAgIC0tPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIAotICAgICAgICAgICAgIHZhbHVlPSJeXz8oKGxvZyl8KFthLXpdW2EtekEtWl0qVGhyZWFkTG9jYWwpfChbQS1aXVtBLVowLTldKihfW0EtWjAtOV0rKSopKSQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbFZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXz9bYS16XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbEZpbmFsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl8/W0EtWl1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEhlYWRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJIZWFkZXIiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlckZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuaGVhZGVyLmZpbGV9Ii8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGltcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19pbXBvcnQuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBdm9pZFN0YXJJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW1wb3J0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50SW1wb3J0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIFNpemUgVmlvbGF0aW9ucy4gICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3NpemVzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmlsZUxlbmd0aCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxpbmVMZW5ndGgiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMjAiIC8+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZVBhdHRlcm4iIHZhbHVlPSJAdmVyc2lvbnxAc2VlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZExlbmd0aCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjIwMCIgLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTnVtYmVyIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTAiIC8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIHdoaXRlc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfd2hpdGVzcGFjZS5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgotCi0gICAgICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbW9kaWZpZXJzLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9Ik1vZGlmaWVyT3JkZXIiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iUmVkdW5kYW50TW9kaWZpZXIiLyAtLT4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzLiBZb3Uga25vdywgdGhvc2Uge30ncyAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJFbXB0eUJsb2NrIi8gLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxlZnRDdXJseSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9Im5sIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJhbG9uZSIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgY29tbW9uIGNvZGluZyBwcm9ibGVtcyAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2NvZGluZy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRvdWJsZUNoZWNrZWRMb2NraW5nIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlTdGF0ZW1lbnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFcXVhbHNIYXNoQ29kZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklubmVyQXNzaWdubWVudCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRlZmF1bHRDb21lc0xhc3QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkZhbGxUaHJvdWdoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9ucyIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfZGVzaWduLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkRlc2lnbkZvckV4dGVuc2lvbiIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJJbnRlcmZhY2VJc1R5cGUiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIi8gLS0+Ci0KLQotICAgICAgICA8IS0tIE1pc2NlbGxhbmVvdXMgb3RoZXIgY2hlY2tzLiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkFycmF5VHlwZVN0eWxlIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkZpbmFsUGFyYW1ldGVycyIvIC0tPgotICAgICAgICA8IS0tIExpbmUgd2l0aCBUcmFpbGluZyBTcGFjZXMgKGRpc2FibGVkIGFzIGl0J3MgdG8gbm9pc3kpCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlxzKyQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iTGluZSBoYXMgdHJhaWxpbmcgc3BhY2VzLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotCi0gICAgPC9tb2R1bGU+Ci0KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNvZGVzdHlsZS1lY2xpcHNlLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jb2Rlc3R5bGUtZWNsaXBzZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWEyNDguLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNvZGVzdHlsZS1lY2xpcHNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxwcm9maWxlcyB2ZXJzaW9uPSIxMSI+Ci08cHJvZmlsZSBraW5kPSJDb2RlRm9ybWF0dGVyUHJvZmlsZSIgbmFtZT0ibXlmYWNlcyIgdmVyc2lvbj0iMTEiPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZCIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcyIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb24iIHZhbHVlPSI4MCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2UiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uIiB2YWx1ZT0iMiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bmsiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIgdmFsdWU9IjEuNSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jayIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZSIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnMiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZSIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb24iIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50IiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0IiB2YWx1ZT0iMTIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyIiB2YWx1ZT0ic3BhY2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keSIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZCIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHkiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaCIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm4iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3ciIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2giIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWYiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZSIgdmFsdWU9IjQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50IiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2UiIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiIHZhbHVlPSIxLjUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjIiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZSIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGgiIHZhbHVlPSIxMjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHkiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHMiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWwiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGUiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIiB2YWx1ZT0iMS41Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2ZvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW4iIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTwvcHJvZmlsZT4KLTwvcHJvZmlsZXM+CmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY29kZXN0eWxlLWlkZWEueG1sIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNvZGVzdHlsZS1pZGVhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5YWViMi4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY29kZXN0eWxlLWlkZWEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb2RlX3NjaGVtZSBuYW1lPSJteWZhY2VzLWlkZWEtY29kZXN0eWxlLnR4dCI+Ci0gIDxvcHRpb24gbmFtZT0iQlJBQ0VfU1RZTEUiIHZhbHVlPSIyIiAvPgotICA8b3B0aW9uIG5hbWU9IkNMQVNTX0JSQUNFX1NUWUxFIiB2YWx1ZT0iMiIgLz4KLSAgPG9wdGlvbiBuYW1lPSJNRVRIT0RfQlJBQ0VfU1RZTEUiIHZhbHVlPSIyIiAvPgotICA8b3B0aW9uIG5hbWU9IkVMU0VfT05fTkVXX0xJTkUiIHZhbHVlPSJ0cnVlIiAvPgotICA8b3B0aW9uIG5hbWU9IldISUxFX09OX05FV19MSU5FIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJDQVRDSF9PTl9ORVdfTElORSIgdmFsdWU9InRydWUiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRklOQUxMWV9PTl9ORVdfTElORSIgdmFsdWU9InRydWUiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQUxJR05fTVVMVElMSU5FX1BBUkFNRVRFUlNfSU5fQ0FMTFMiIHZhbHVlPSJ0cnVlIiAvPgotICA8b3B0aW9uIG5hbWU9IkFMSUdOX01VTFRJTElORV9GT1IiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJJRl9CUkFDRV9GT1JDRSIgdmFsdWU9IjMiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRE9XSElMRV9CUkFDRV9GT1JDRSIgdmFsdWU9IjMiIC8+Ci0gIDxvcHRpb24gbmFtZT0iV0hJTEVfQlJBQ0VfRk9SQ0UiIHZhbHVlPSIzIiAvPgotICA8b3B0aW9uIG5hbWU9IkZPUl9CUkFDRV9GT1JDRSIgdmFsdWU9IjMiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRU5BQkxFX0pBVkFET0NfRk9STUFUVElORyIgdmFsdWU9ImZhbHNlIiAvPgotICA8b3B0aW9uIG5hbWU9IkpEX1BfQVRfRU1QVFlfTElORVMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPEFERElUSU9OQUxfSU5ERU5UX09QVElPTlMgZmlsZVR5cGU9ImpzIj4KLSAgICA8b3B0aW9uIG5hbWU9IklOREVOVF9TSVpFIiB2YWx1ZT0iNCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNPTlRJTlVBVElPTl9JTkRFTlRfU0laRSIgdmFsdWU9IjgiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJUQUJfU0laRSIgdmFsdWU9IjQiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJVU0VfVEFCX0NIQVJBQ1RFUiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iU01BUlRfVEFCUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTEFCRUxfSU5ERU5UX1NJWkUiIHZhbHVlPSIwIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTEFCRUxfSU5ERU5UX0FCU09MVVRFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDwvQURESVRJT05BTF9JTkRFTlRfT1BUSU9OUz4KLTwvY29kZV9zY2hlbWU+Ci0KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXItcmVnZXhwLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXItcmVnZXhwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ZTUxYy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXJlZ2V4cC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1eL1wqJAotXiBcKiArTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIFwoQVNGXCkgdW5kZXIgb25lJAotXiBcKiArb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlJAotXiBcKiArZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24kCi1eIFwqICtyZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlJAotXiBcKiArdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgXCh0aGUkCi1eIFwqICsiTGljZW5zZSJcKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSQKLV4gXCogK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQkCi1eIFwqICokCi1eIFwqICtodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAkCi1eIFwqICokCi1eIFwqICtVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsJAotXiBcKiArc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4kCi1eIFwqICsiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkkCi1eIFwqICtLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUkCi1eIFwqICtzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zJAotXiBcKiArdW5kZXIgdGhlIExpY2Vuc2UuJAotXiBcKi8kCmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGYxZDYuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWhlYWRlci1zcGFjZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyZjNjZS4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1oZWFkZXIudHh0IGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvdG9iYWdvL2NoZWNrc3R5bGUtaGVhZGVyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMjEwMy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1oZWFkZXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotXnBhY2thZ2UKLV4kCi1eL1wqJAotXiBcKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gXChBU0ZcKSB1bmRlciBvbmUgb3IgbW9yZSQKLV4gXCogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoJAotXiBcKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuJAotXiBcKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCQKLV4gXCogXCh0aGUgIkxpY2Vuc2UiXCk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCQKLV4gXCogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQkCi1eIFwqJAotXiBcKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCQKLV4gXCokCi1eIFwqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUkCi1eIFwqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsJAotXiBcKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4kCi1eIFwqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQkCi1eIFwqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiQKLV4gXCovJAotXiQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1zdHJpY3QueG1sIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvdG9iYWdvL2NoZWNrc3R5bGUtc3RyaWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhNjcxYy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1zdHJpY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjIvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzIuZHRkIj4KLQotPCEtLQotCi0gIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyB0aGUgc3VuIGNvZGluZyBjb252ZW50aW9ucyBmcm9tOgotCi0gICAgLSB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgU3VuIENvZGUgQ29udmVudGlvbnMgYXQgaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252LwotCi0gICAgLSB0aGUgSmF2YWRvYyBndWlkZWxpbmVzIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvamF2YWRvYy93cml0aW5nZG9jY29tbWVudHMvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgSkRLIEFwaSBkb2N1bWVudGF0aW9uIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9kb2NzL2FwaS9pbmRleC5odG1sCi0KLSAgICAtIHNvbWUgYmVzdCBwcmFjdGljZXMKLQotICBDaGVja3N0eWxlIGlzIHZlcnkgY29uZmlndXJhYmxlLiBCZSBzdXJlIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gYXQKLSAgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0IChvciBpbiB5b3VyIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uKS4KLQotICBNb3N0IENoZWNrcyBhcmUgY29uZmlndXJhYmxlLCBiZSBzdXJlIHRvIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24uCi0KLSAgVG8gY29tcGxldGVseSBkaXNhYmxlIGEgY2hlY2ssIGp1c3QgY29tbWVudCBpdCBvdXQgb3IgZGVsZXRlIGl0IGZyb20gdGhlIGZpbGUuCi0KLSAgRmluYWxseSwgaXQgaXMgd29ydGggcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KLQotLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgPCEtLSBDaGVja3MgdGhhdCBhIHBhY2thZ2UuaHRtbCBmaWxlIGV4aXN0cyBmb3IgZWFjaCBwYWNrYWdlLiAgICAgLS0+Ci0gIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sI1BhY2thZ2VIdG1sIC0tPgotCi0gIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwjTmV3bGluZUF0RW5kT2ZGaWxlIC0tPgotICA8bW9kdWxlIG5hbWU9Ik5ld2xpbmVBdEVuZE9mRmlsZSIvPgotCi0gIDwhLS0gQ2hlY2tzIHRoYXQgcHJvcGVydHkgZmlsZXMgY29udGFpbiB0aGUgc2FtZSBrZXlzLiAgICAgICAgIC0tPgotICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNUcmFuc2xhdGlvbiAtLT4KLSAgPG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvPgotCi0KLSAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJjYWNoZUZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuY2FjaGUuZmlsZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2hhcnNldCIgdmFsdWU9IlVURi04Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhYldpZHRoIiB2YWx1ZT0iMiIvPgotCi0gICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwKLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jTWV0aG9kIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1R5cGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVmFyaWFibGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jU3R5bGUiLz4gICAtLT4KLQotCi0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBOYW1pbmcgQ29udmVudGlvbnMuICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxWYXJpYWJsZU5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhY2thZ2VOYW1lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOYW1lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTdGF0aWNWYXJpYWJsZU5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIi8+Ci0KLQotCi0KLSAgICA8IS0tIENoZWNrcyBmb3IgSGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAgIC0tPgotICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJIZWFkZXIiPiAtLT4KLSAgICA8IS0tIFRoZSBmb2xsb3cgcHJvcGVydHkgdmFsdWUgZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5ICAgICAtLT4KLSAgICA8IS0tIHRvIGhhdmUgYWNjZXNzIHRvIEFOVCBwcm9wZXJ0aWVzLiBJbiB0aGlzIGNhc2UgaXQgdXNlcyAtLT4KLSAgICA8IS0tIHRoZSAke2Jhc2VkaXJ9IHByb3BlcnR5IHRvIGFsbG93IENoZWNrc3R5bGUgdG8gYmUgcnVuICAtLT4KLSAgICA8IS0tIGZyb20gYW55IGRpcmVjdG9yeSB3aXRoaW4gYSBwcm9qZWN0LiBTZWUgcHJvcGVydHkgICAgICAtLT4KLSAgICA8IS0tIGV4cGFuc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWcuaHRtbCNwcm9wZXJ0aWVzICAgICAgICAtLT4KLSAgICA8IS0tIDxwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tICAgICBuYW1lPSJoZWFkZXJGaWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9qYXZhLmhlYWRlciIvPiAtLT4KLSAgICA8IS0tIEZvbGxvd2luZyBpbnRlcnByZXRzIHRoZSBoZWFkZXIgZmlsZSBhcyByZWd1bGFyIGV4cHJlc3Npb25zLiAtLT4KLSAgICA8IS0tIDwvbW9kdWxlPiAtLT4KLQotICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwSGVhZGVyIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmhlYWRlci5maWxlfSIvPgotICAgICAgPCEtLTxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIiIHZhbHVlPSJecGFja2FnZSBcbl4kXG4vXCokXG5eIFwqIENvcHlyaWdodCBcZFxkXGRcZC1cZFxkXGRcZCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uJFxuXiBcKiRcbl4gXCogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBcKHRoZSAmcXVvdDtMaWNlbnNlJnF1b3Q7XClcOyRcbl4gXCogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiRcbl4gXCogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JFxuXiBcKiRcbl4gXCogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAkXG5eIFwqJFxuXiBcKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlJFxuXiBcKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywkXG5eIFwqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiRcbl4gXCogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCRcbl4gXCogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJFxuXiBcKi8kXG5eJCIvPi0tPgotICAgIDwvbW9kdWxlPgotCi0KLQotCi0KLSAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfaW1wb3J0Lmh0bWwgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJBdm9pZFN0YXJJbXBvcnQiLz4KLSAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4gPCEtLSBkZWZhdWx0cyB0byBzdW4uKiBwYWNrYWdlcyAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgotICAgIDxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPgotCi0KLSAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19zaXplcy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iRmlsZUxlbmd0aCIvPgotICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTIwIi8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPG1vZHVsZSBuYW1lPSJNZXRob2RMZW5ndGgiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck51bWJlciIvPgotCi0KLSAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3doaXRlc3BhY2UuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkVtcHR5Rm9ySXRlcmF0b3JQYWQiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VBZnRlciIvPgotICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQmVmb3JlIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJPcGVyYXRvcldyYXAiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhcmVuUGFkIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJUeXBlY2FzdFBhcmVuUGFkIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJUYWJDaGFyYWN0ZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBZnRlciIvPgotICAgIDwhLS08bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBcm91bmQiLz4tLT4KLQotICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19tb2RpZmllcnMuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9Ik1vZGlmaWVyT3JkZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBibG9ja3MuIFlvdSBrbm93LCB0aG9zZSB7fSdzICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19ibG9ja3MuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJFbXB0eUJsb2NrIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik5lZWRCcmFjZXMiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiLz4KLQotCi0gICAgPCEtLSBDaGVja3MgZm9yIGNvbW1vbiBjb2RpbmcgcHJvYmxlbXMgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2NvZGluZy5odG1sIC0tPgotICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJBdm9pZElubGluZUNvbmRpdGlvbmFscyIvPiAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkNvdmFyaWFudEVxdWFscyIvPgotICAgIDxtb2R1bGUgbmFtZT0iRG91YmxlQ2hlY2tlZExvY2tpbmciLz4gICAgPCEtLSBNWSBGQVZPVVJJVEUgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgotICAgIDxtb2R1bGUgbmFtZT0iRXF1YWxzSGFzaENvZGUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVTZXR0ZXIiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9IiBpZ25vcmVDb25zdHJ1Y3RvclBhcmFtZXRlciIgdmFsdWU9InRydWUiIC8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW5zdGFudGlhdGlvbiI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPG1vZHVsZSBuYW1lPSJJbm5lckFzc2lnbm1lbnQiLz4KLSAgICA8IS0tIDxtb2R1bGUgbmFtZT0iTWFnaWNOdW1iZXIiLz4gLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50VGhyb3dzIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd1VuY2hlY2tlZCIgdmFsdWU9InRydWUiLz4KLSAgICA8L21vZHVsZT4KLSAgICA8bW9kdWxlIG5hbWU9IlN0cmluZ0xpdGVyYWxFcXVhbGl0eSIvPgotICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuRXhwcmVzc2lvbiIvPgotICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTdXBlckNsb25lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTdXBlckZpbmFsaXplIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVGhyb3dzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlRGVjbGFyYXRpb24iLz4KLSAgICA8bW9kdWxlIG5hbWU9IkRlY2xhcmF0aW9uT3JkZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlckFzc2lnbm1lbnQiLz4KLSAgICA8bW9kdWxlIG5hbWU9IkRlY2xhcmF0aW9uT3JkZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik11bHRpcGxlVmFyaWFibGVEZWNsYXJhdGlvbnMiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlVubmVjZXNzYXJ5UGFyZW50aGVzZXMiLz4KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJEZXNpZ25Gb3JFeHRlbnNpb24iLyAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8gLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8gLS0+Ci0KLSAgICA8bW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIi8+Ci0KLQotICAgIDwhLS0gTWlzY2VsbGFuZW91cyBvdGhlciBjaGVja3MuICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLz4KLSAgICA8IS0tPG1vZHVsZSBuYW1lPSJGaW5hbFBhcmFtZXRlcnMiLz4gLS0+Ci0gICAgPCEtLSBMaW5lIHdpdGggVHJhaWxpbmcgU3BhY2VzIChkaXNhYmxlZCBhcyBpdCdzIHRvIG5vaXN5KQotICAgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXHMrJCIvPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iTGluZSBoYXMgdHJhaWxpbmcgc3BhY2VzLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgLS0+Ci0KLSAgICA8IS0tIExldCB0b2RvIHBsdWdpbiBoYW5kbGUgdGhpcy4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUb2RvQ29tbWVudCIvPgotICAgICAgICAtLT4KLQotICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IigocHVibGljKXwocHJvdGVjdGVkKSlccyt2b2lkXHMrZmluYWxpemVcKFxzKlwpIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIGZpbmFsaXplcnMiLz4KLSAgICA8L21vZHVsZT4KLSAgICA8IS0tIE5vIGRpcmVjdCBwcmludGluZyB0byBTeXN0ZW0ub3V0IG9yIFN5c3RlbS5lcnIgLS0+Ci0KLQotICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlN5c3RlbVwuKG91dHxlcnIpXC4iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iRG9uJ3Qgd3JpdGUgZGlyZWN0bHkgdG8gU3lzdGVtLm91dCBvdXIgU3lzdGVtLmVyciIvPgotICAgIDwvbW9kdWxlPgotICAgIDwhLS0gTm8gQGF1dGhvciB0YWdzIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IkBhdXRob3IiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiAJdmFsdWU9Ik5vIEBhdXRob3IgdGFnIGFsbG93ZWQiLz4KLSAgICA8L21vZHVsZT4KLQotCi0gICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotCi0gIDwvbW9kdWxlPgotCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLnhtbCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNTcyZC4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjIvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzIuZHRkIj4KLQotPCEtLQotCi0gIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyB0aGUgc3VuIGNvZGluZyBjb252ZW50aW9ucyBmcm9tOgotCi0gICAgLSB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgU3VuIENvZGUgQ29udmVudGlvbnMgYXQgaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252LwotCi0gICAgLSB0aGUgSmF2YWRvYyBndWlkZWxpbmVzIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvamF2YWRvYy93cml0aW5nZG9jY29tbWVudHMvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgSkRLIEFwaSBkb2N1bWVudGF0aW9uIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9kb2NzL2FwaS9pbmRleC5odG1sCi0KLSAgICAtIHNvbWUgYmVzdCBwcmFjdGljZXMKLQotICBDaGVja3N0eWxlIGlzIHZlcnkgY29uZmlndXJhYmxlLiBCZSBzdXJlIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gYXQKLSAgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0IChvciBpbiB5b3VyIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uKS4KLQotICBNb3N0IENoZWNrcyBhcmUgY29uZmlndXJhYmxlLCBiZSBzdXJlIHRvIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24uCi0KLSAgVG8gY29tcGxldGVseSBkaXNhYmxlIGEgY2hlY2ssIGp1c3QgY29tbWVudCBpdCBvdXQgb3IgZGVsZXRlIGl0IGZyb20gdGhlIGZpbGUuCi0KLSAgRmluYWxseSwgaXQgaXMgd29ydGggcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KLQotLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IGEgcGFja2FnZS5odG1sIGZpbGUgZXhpc3RzIGZvciBlYWNoIHBhY2thZ2UuICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbCNQYWNrYWdlSHRtbCAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNOZXdsaW5lQXRFbmRPZkZpbGUgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJOZXdsaW5lQXRFbmRPZkZpbGUiLz4KLQotICAgIDwhLS0gQ2hlY2tzIHRoYXQgcHJvcGVydHkgZmlsZXMgY29udGFpbiB0aGUgc2FtZSBrZXlzLiAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI1RyYW5zbGF0aW9uIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iVHJhbnNsYXRpb24iLz4KLQotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFyc2V0IiB2YWx1ZT0iVVRGLTgiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhYldpZHRoIiB2YWx1ZT0iMiIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBKYXZhZG9jIGNvbW1lbnRzLiAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbAotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NTdHlsZSIvPiAgIC0tPgotCi0KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBOYW1pbmcgQ29udmVudGlvbnMuICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbmFtaW5nLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ29uc3RhbnROYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWVtYmVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdGF0aWNWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSIvPgotCi0KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBIZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAgIC0tPgotICAgICAgICA8IS0tIDxtb2R1bGUgbmFtZT0iSGVhZGVyIj4gLS0+Ci0gICAgICAgICAgICA8IS0tIFRoZSBmb2xsb3cgcHJvcGVydHkgdmFsdWUgZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5ICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gdG8gaGF2ZSBhY2Nlc3MgdG8gQU5UIHByb3BlcnRpZXMuIEluIHRoaXMgY2FzZSBpdCB1c2VzIC0tPgotICAgICAgICAgICAgPCEtLSB0aGUgJHtiYXNlZGlyfSBwcm9wZXJ0eSB0byBhbGxvdyBDaGVja3N0eWxlIHRvIGJlIHJ1biAgLS0+Ci0gICAgICAgICAgICA8IS0tIGZyb20gYW55IGRpcmVjdG9yeSB3aXRoaW4gYSBwcm9qZWN0LiBTZWUgcHJvcGVydHkgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gZXhwYW5zaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnLmh0bWwjcHJvcGVydGllcyAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tIDxwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gICAgIG5hbWU9ImhlYWRlckZpbGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSAgICAgdmFsdWU9IiR7YmFzZWRpcn0vamF2YS5oZWFkZXIiLz4gLS0+Ci0gICAgICAgICAgICA8IS0tIEZvbGxvd2luZyBpbnRlcnByZXRzIHRoZSBoZWFkZXIgZmlsZSBhcyByZWd1bGFyIGV4cHJlc3Npb25zLiAtLT4KLSAgICAgICAgPCEtLSA8L21vZHVsZT4gLS0+Ci0KLSAgICAgICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwSGVhZGVyIj4KLSAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlckZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuaGVhZGVyLmZpbGV9Ii8+Ci0gICAgICAgICAgICAgPCEtLTxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIiIHZhbHVlPSJecGFja2FnZSBcbl4kXG4vXCokXG5eIFwqIENvcHlyaWdodCAoXGRcZFxkXGQtKT9cZFxkXGRcZCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uJFxuXiBcKiRcbl4gXCogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBcKHRoZSAmcXVvdDtMaWNlbnNlJnF1b3Q7XClcOyRcbl4gXCogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiRcbl4gXCogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JFxuXiBcKiRcbl4gXCogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAkXG5eIFwqJFxuXiBcKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlJFxuXiBcKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywkXG5eIFwqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiRcbl4gXCogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCRcbl4gXCogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJFxuXiBcKi8kXG5eJCIvPi0tPgotICAgICAgICAgPC9tb2R1bGU+Ci0KLQotCi0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2ltcG9ydC5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4gPCEtLSBkZWZhdWx0cyB0byBzdW4uKiBwYWNrYWdlcyAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVbnVzZWRJbXBvcnRzIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfc2l6ZXMuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjEyMCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTnVtYmVyIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ193aGl0ZXNwYWNlLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlGb3JJdGVyYXRvclBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQWZ0ZXIiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VCZWZvcmUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJPcGVyYXRvcldyYXAiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJlblBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVjYXN0UGFyZW5QYWQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUYWJDaGFyYWN0ZXIiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJXaGl0ZXNwYWNlQWZ0ZXIiLz4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFyb3VuZCIvPi0tPgotCi0gICAgICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbW9kaWZpZXJzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzLiBZb3Uga25vdywgdGhvc2Uge30ncyAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dJblN3aXRjaENhc2UiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJ0ZXh0Ii8+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkxJVEVSQUxfQ0FUQ0giLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiLz4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjb21tb24gY29kaW5nIHByb2JsZW1zICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJBdm9pZElubGluZUNvbmRpdGlvbmFscyIvPiAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb3ZhcmlhbnRFcXVhbHMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJEb3VibGVDaGVja2VkTG9ja2luZyIvPiAgICA8IS0tIE1ZIEZBVk9VUklURSAtLT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iRW1wdHlTdGF0ZW1lbnQiLz4tLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFcXVhbHNIYXNoQ29kZSIvPgotICAgICAgICA8IS0tbW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlU2V0dGVyIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iIGlnbm9yZUNvbnN0cnVjdG9yUGFyYW1ldGVyIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPC9tb2R1bGUtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW5zdGFudGlhdGlvbiI+Ci0gICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJNYWdpY051bWJlciIvPiAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudFRocm93cyI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93VW5jaGVja2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdHJpbmdMaXRlcmFsRXF1YWxpdHkiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3VwZXJDbG9uZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN1cGVyRmluYWxpemUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVGhyb3dzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZURlY2xhcmF0aW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9ucyIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfZGVzaWduLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkRlc2lnbkZvckV4dGVuc2lvbiIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvIC0tPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW50ZXJmYWNlSXNUeXBlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIi8+Ci0KLQotICAgICAgICA8IS0tIE1pc2NlbGxhbmVvdXMgb3RoZXIgY2hlY2tzLiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLz4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8+IC0tPgotICAgICAgICA8IS0tIExpbmUgd2l0aCBUcmFpbGluZyBTcGFjZXMgKGRpc2FibGVkIGFzIGl0J3MgdG8gbm9pc3kpCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJccyskIi8+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJMaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAtLT4KLQotICAgICAgICA8IS0tIExldCB0b2RvIHBsdWdpbiBoYW5kbGUgdGhpcy4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUb2RvQ29tbWVudCIvPgotICAgICAgICAtLT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iKChwdWJsaWMpfChwcm90ZWN0ZWQpKVxzK3ZvaWRccytmaW5hbGl6ZVwoXHMqXCkiLz4KLQkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgZmluYWxpemVycyIvPgotICAgICAgICA8L21vZHVsZT4KLQkgICAgICA8IS0tIE5vIGRpcmVjdCBwcmludGluZyB0byBTeXN0ZW0ub3V0IG9yIFN5c3RlbS5lcnIgLS0+Ci0KLQotIAkgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iU3lzdGVtXC4ob3V0fGVycilcLiIvPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iRG9uJ3Qgd3JpdGUgZGlyZWN0bHkgdG8gU3lzdGVtLm91dCBvdXIgU3lzdGVtLmVyciIvPgotIAkgICAgICA8L21vZHVsZT4KLQkgCSAgICA8IS0tIE5vIEBhdXRob3IgdGFncyAtLT4KLSAJICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gCSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IkBhdXRob3IiLz4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgCXZhbHVlPSJObyBAYXV0aG9yIHRhZyBhbGxvd2VkIi8+Ci0gCSAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJzdHLDpGhsZWtyZXV6ZW4iLz4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgCXZhbHVlPSJObyBzdHLDpGhsZWtyZXV6ZW4gYWxsb3dlZCIvPgotIAkgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0KLSAgICA8L21vZHVsZT4KLQotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9vdGhlci9ub3JtYWxpemVyL1JFQURNRS50eHQgYi9vdGhlci9ub3JtYWxpemVyL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTFiNjQuLjAwMDAwMDAKLS0tIGEvb3RoZXIvbm9ybWFsaXplci9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotVGhpcyBwcm9qZWN0IGlzIGEgc2ltcGxlIGNvbW1hbmQtbGluZSB0b29sIHRoYXQgIm5vcm1hbGlzZXMiIGEgSlNQIFRMRCBmaWxlIG9yIGEgSlNGIGZhY2VzLWNvbmZpZyBmaWxlLgotQWZ0ZXIgdHdvIGZpbGVzIGhhdmUgYmVlbiAibm9ybWFsaXplZCIsIHRoZXkgY2FuIHRoZW4gYmUgY29tcGFyZWQgd2l0aCBhIHNpbXBsZSAiZGlmZiIgdG9vbCB0byBzZWUgd2hhdAotcmVhbCBkaWZmZXJlbmNlcyAoaWYgYW55KSB0aGVyZSBhcmUgYmV0d2VlbiB0aGUgdHdvIG9yaWdpbmFsIGZpbGVzLgotCi1BbGwgIm5vbi1jcml0aWNhbCIgZGF0YSwgbGlrZSBjb21tZW50cyBhbmQgImRlc2NyaXB0aW9uIiBmaWVsZHMgYXJlIGRpc2NhcmRlZC4gCi1BbGwgeG1sIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSB0aGVuIHNvcnRlZCBpbnRvIGEgY29uc2lzdGVudCBvcmRlcjoKLSAqIGVsZW1lbnRzIHdpdGgganVzdCB0ZXh0IGNvbnRlbnQgYXJlIHNvcnRlZCBiZWZvcmUgb3RoZXJzLgotICogZWxlbWVudHMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBieSBlbGVtZW50IG5hbWUKLSAqIGVsZW1lbnRzIHdpdGggc2FtZSBuYW1lIGFyZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlaXIgY2hpbGQgbm9kZXMKLSAgIChtZWFucyB0aGF0IDx0YWc+PG5hbWU+Zm9vPC9uYW1lPjwvdGFnPiBpcyBzb3J0ZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhlIG5hbWUgY2hpbGQpLgotIAotVGhpcyB0b29sIGlzIHBhcnRseSBhIGdlbmVyaWMgWE1MICJub3JtYWxpc2VyIiwgYnV0IHRha2VzIGEgZmV3IHNob3J0Y3V0cyB0aGF0IHdvcmsgc3BlY2lmaWNhbGx5Ci1vbiBUTEQgYW5kIGZhY2VzLWNvbmZpZyBmaWxlcy4gSXQgY291bGQgcG9zc2libHkgYmUgZXhwYW5kZWQgdG8gc3VwcG9ydCBjb21wYXJpc29uIG9mIG90aGVyIHhtbAotZmlsZXMsIGJ1dCB3YXNuJ3Qgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciB0aGF0IHB1cnBvc2UuIEFuZCBpdCBpcyBkZWZpbml0ZWx5IGEgImhhY2siOyBhIHRvb2wKLXRoYXQgaXMganVzdCBjb21wbGV4IGVub3VnaCBmb3IgaXRzIHB1cnBvc2UgYnV0IG5vdCBlbGVnYW50LiBGb3IgZXhhbXBsZToKLSogIm1peGVkIGNvbnRlbnQiIGVsZW1lbnRzIGFyZSBqdXN0IG5vdCBzdXBwb3J0ZWQKLSogeG1sIG5hbWVzcGFjZXMgYXJlIG5vdCBoYW5kbGVkIHByb3Blcmx5Ci0qIGV4dGVybmFsIGR0ZHMgYW5kIGVudGl0eSByZWZlcmVuY2VzIGFyZSBpZ25vcmVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9ub3JtIGIvb3RoZXIvbm9ybWFsaXplci9ub3JtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Y2ZlNTQyLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvbm9ybQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWphdmEgLWNwIHRhcmdldC9jbGFzc2VzIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXIuTm9ybWFsaXplciAkQApkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9wb20ueG1sIGIvb3RoZXIvbm9ybWFsaXplci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JjYzgwLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5ub3JtYWxpemVyPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPm5vcm1hbGl6ZXI8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvQXR0cmlidXRlLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyYTc3ZC4uMDAwMDAwMAotLS0gYS9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubm9ybWFsaXplcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gICAgU3RyaW5nIG5hbWU7Ci0gICAgU3RyaW5nIHZhbHVlOwotCi0gICAgcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQobmFtZSk7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIj0iKTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIlwiIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKQotICAgIHsKLSAgICAgICAgQXR0cmlidXRlIG90aGVyQXR0ciA9IChBdHRyaWJ1dGUpIG90aGVyOwotICAgICAgICByZXR1cm4gbmFtZS5jb21wYXJlVG8ob3RoZXJBdHRyLm5hbWUpOwotICAgIH0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvRWxlbWVudC5qYXZhIGIvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk2NTYxLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50IGFuIFhNTCBlbGVtZW50IHdoaWNoIGhhcyBlaXRoZXIgYm9keSB0ZXh0IG9yIGEgbGlzdCBvZiBjaGlsZCBlbGVtZW50cy4KLSAqIDxwPgotICogTWl4ZWQtY29udGVudCBlbGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4gTmFtZXNwYWNlcyBhcmUgaWdub3JlZC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gICAgc3RhdGljIFN0cmluZ1tdIFNPUlRfUFJJT1JJVFlfSElHSCA9IG5ldyBTdHJpbmdbXQotICAgIHsKLSAgICAgICAgIm5hbWUiLAotICAgIH07Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZ1tdIFNPUlRfUFJJT1JJVFlfTE9XID0gbmV3IFN0cmluZ1tdCi0gICAgewotICAgICAgICAiY2xhc3MiCi0gICAgfTsKLQotICAgIFN0cmluZyBuYW1lOwotICAgIEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXM7Ci0gICAgU3RyaW5nIGNvbnRlbnQ7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgCi0gICAgLy8gVmFsdWUgdXNlZCB0byBjaG9vc2Ugb3JkZXJpbmcgZm9yIHR3byBlbGVtZW50cyB3aXRoIGRpZmZlcmVudCBuYW1lcy4KLSAgICAvLyBFbGVtZW50cyB3aG9zZSBuYW1lIG1hdGNoZXMgYSAiaGlnaCBwcmlvcml0eSIgcGF0dGVybiBhcmUgb3V0cHV0IGJlZm9yZQotICAgIC8vIGVsZW1lbnRzIHdpdGggIm5vcm1hbCIgbmFtZXMsIHdoaWNoIGFyZSBvdXRwdXQgYmVmb3JlIGVsZW1lbnRzIHdob3NlCi0gICAgLy8gbmFtZXMgbWF0Y2ggYSAibG93IHByaW9yaXR5IiBwYXR0ZXJuLgotICAgIGludCBzb3J0UHJpb3JpdHkgPSAwOwotCi0gICAgLy8gVmFsdWUgdXNlZCB0byBjaG9vc2Ugb3JkZXJpbmcgZm9yIHR3byBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUKLSAgICAvLyBuYW1lIGFuZCBubyB0ZXh0IGNvbnRlbnQuIFRoaXMgaXMgYnVpbHQgZnJvbSB0aGUgdGV4dCBjb250ZW50IG9mCi0gICAgLy8gdGhlIChvcmRlcmVkKSBzZXQgb2YgY2hpbGQgZWxlbWVudHMsIHNvIHRoYXQgdHdvIG5vZGVzIHdpdGggc2ltaWxhcgotICAgIC8vIGNoaWxkIGVsZW1lbnRzIGdldCBzb3J0ZWQgaW4gdGhlIHNhbWUgb3JkZXIuCi0gICAgU3RyaW5nIHNvcnRLZXkgPSBudWxsOwotCi0gICAgLy8gVGhlIGF0dHJpYnV0ZXMgYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGJlZm9yZSBwYXNzaW5nIGluIGhlcmUuCi0gICAgcHVibGljIEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICBzb3J0UHJpb3JpdHkgPSBnZXRTb3J0UHJpb3JpdHkobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKEVsZW1lbnQgY2hpbGQpCi0gICAgewotICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNvcnRDaGlsZHJlbigpCi0gICAgewotICAgICAgICBpZiAoY2hpbGRyZW4uaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIHNvcnQgaGVyZS4KLSAgICAgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgc29ydEtleSA9ICIiOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc29ydEtleSA9IGNvbnRlbnQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaXJzdCBlbnN1cmUgZWFjaCBjaGlsZCBpcyBpbnRlcm5hbGx5IHNvcnRlZAotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWxlbWVudCkgaS5uZXh0KCkpLnNvcnRDaGlsZHJlbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IHNvcnQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gcmVsYXRpdmUgdG8gZWFjaCBvdGhlcgotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuKTsKLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBzb3J0S2V5IGZvciB0aGlzIGVsZW1lbnQsIHVzZWQgd2hlbgotICAgICAgICAvLyB0d28gZWxlbWVudHMgaGF2ZSBpZGVudGljYWwgbmFtZXMgYW5kIHRoZXJlZm9yZSBuZWVkCi0gICAgICAgIC8vIHRvIGJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZWlyCi0gICAgICAgIC8vIGNoaWxkIGVsZW1lbnRzLgotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiJiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChjaGlsZC5zb3J0S2V5KTsKLSAgICAgICAgfQotICAgICAgICBzb3J0S2V5ID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50QW1vdW50KQotICAgIHsKLSAgICAgICAgVXRpbHMuaW5kZW50KHdyaXRlciwgaW5kZW50QW1vdW50KTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCgiPCIpOwotICAgICAgICB3cml0ZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxhdHRyaWJ1dGVzLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW2ldLnByaW50KHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI+Iik7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGNvbnRlbnQpOwotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPC8iKTsKLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI+XG4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGlsZHJlbi5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiLz5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPlxuIik7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBlLnByaW50KHdyaXRlciwgaW5kZW50QW1vdW50KzEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVXRpbHMuaW5kZW50KHdyaXRlciwgaW5kZW50QW1vdW50KTsKLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIjwvIik7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyBob3cgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBzb3J0ZWQgcmVsYXRpdmUgdG8KLSAgICAgKiBvdGhlciBlbGVtZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3Qgc2FmZSB0byBjYWxsIHVudGlsIGFmdGVyIHNvcnRDaGlsZHJlbigpIGhhcyBiZWVuIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKQotICAgIHsKLSAgICAgICAgRWxlbWVudCBvdGhlckVsZW1lbnQgPSAoRWxlbWVudCkgb3RoZXI7Ci0KLSAgICAgICAgLy8gU29ydCB0YWdzIHdpdGgganVzdCB0ZXh0IGNvbnRlbnQgYmVmb3JlIG9uZXMgd2l0aCBjaGlsZCBlbGVtZW50cwotICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5pc0VtcHR5KCkgJiYgIW90aGVyRWxlbWVudC5jaGlsZHJlbi5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNoaWxkcmVuLmlzRW1wdHkoKSAmJiBvdGhlckVsZW1lbnQuY2hpbGRyZW4uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuICsxOwotCi0gICAgICAgIGlmIChuYW1lLmVxdWFscyhvdGhlckVsZW1lbnQubmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE9rLCB3ZSBoYXZlIHR3byB0YWdzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYm90aCBoYXZlIGNoaWxkIGVsZW1lbnRzLgotICAgICAgICAgICAgLy8gU29ydCBieSB0aGUgc29ydGtleSB3ZSBjb21wdXRlZCBkdXJpbmcgdGhlIHNvcnRDaGlsZHJlbiBtZXRob2QKLSAgICAgICAgICAgIHJldHVybiBzb3J0S2V5LmNvbXBhcmVUbyhvdGhlckVsZW1lbnQuc29ydEtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOYW1lcyBhcmUgZGlmZmVyZW50OiBjaGVjayB3aGV0aGVyIGVpdGhlciBuYW1lIGhhcyBzcGVjaWFsIHByaW9yaXR5LgotICAgICAgICBpZiAoc29ydFByaW9yaXR5ICE9IG90aGVyRWxlbWVudC5zb3J0UHJpb3JpdHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvdGhlckVsZW1lbnQuc29ydFByaW9yaXR5IC0gc29ydFByaW9yaXR5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT2ssIGRpZmZlcmVudCBuYW1lcyBhbmQgdGhlIHByaW9yaXR5IG9mIHRoZSBuYW1lIGlzIGVxdWFsLgotICAgICAgICAvLyBTbyBqdXN0IHNvcnQgYWxwaGFiZXRpY2FsbHkuCi0gICAgICAgIHJldHVybiBuYW1lLmNvbXBhcmVUbyhvdGhlckVsZW1lbnQubmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSAicHJpb3JpdHkiIG9mIHRoaXMgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOYW1lcyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgc29ydGVkIGVhcmxpZXIgaW4gdGhlIGxpc3Qgb2YgZWxlbWVudHMuCi0gICAgICogQW5kIGFzIGVsZW1lbnRzIHdpdGggZXF1YWwgbmFtZXMgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnRzCi0gICAgICogb2YgdGhlaXIgY2hpbGRyZW4sIHRoaXMgYWxzbyBhZmZlY3RzIHRoZSBzb3J0aW5nIG9yZGVyIG9mIHRoZSBwYXJlbnQKLSAgICAgKiBlbGVtZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSAicHJpb3JpdHkiIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIE5vcm1hbCBlbGVtZW50IG5hbWVzIGhhdmUgemVybyBwcmlvcml0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRTb3J0UHJpb3JpdHkoU3RyaW5nIGVuYW1lKQotICAgIHsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8U09SVF9QUklPUklUWV9ISUdILmxlbmd0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW5hbWUuY29udGFpbnMoU09SVF9QUklPUklUWV9ISUdIW2ldKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhbHdheXMgcG9zaXRpdmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU09SVF9QUklPUklUWV9ISUdILmxlbmd0aCAtIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaW50IGk9MDsgaTxTT1JUX1BSSU9SSVRZX0xPVy5sZW5ndGg7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVuYW1lLmNvbnRhaW5zKFNPUlRfUFJJT1JJVFlfTE9XW2ldKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhbHdheXMgbmVnYXRpdmUKLSAgICAgICAgICAgICAgICByZXR1cm4gaSAtIFNPUlRfUFJJT1JJVFlfTE9XLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTm9ybWFsaXplci5qYXZhIGIvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTm9ybWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJlOWI5Li4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogUmVhZCBpbnB1dCBmaWxlIGFuZCB3cml0ZSBpdCBvdXQgd2l0aCBldmVyeXRoaW5nIG5vcm1hbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3JtYWxpemVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLSAgICBTdGFjayBlbGVtZW50cyA9IG5ldyBTdGFjaygpOwotICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotICAgIFN0cmluZ0J1ZmZlciBjdXJyQ29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogQXBwIGlucHV0RmlsZSIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBuZXcgTm9ybWFsaXplcigpLnByb2Nlc3MoYXJnc1swXSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0KLSAgICAgICAgcGFyc2VyLnBhcnNlKGYsIHRoaXMpOwotICAgICAgICByb290RWxlbWVudC5zb3J0Q2hpbGRyZW4oKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnByaW50KHB3LCAwKTsKLSAgICAgICAgcHcuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVbXSBFTVBUWV9BVFRSUyA9IG5ldyBBdHRyaWJ1dGVbMF07Ci0KLSAgICAvLyBJZ25vcmUgYW55IGV4dGVybmFsIGVudGl0aWVzLiBJbiBwYXJ0aWN1bGFyLCB0aGlzIHNraXBzIHRoZSByZWFkaW5nIG9mIGR0ZHMuCi0gICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0gICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoaXMpOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIGludCBuQXR0cnMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBMaXN0IGF0dHJMaXN0ID0gbmV3IEFycmF5TGlzdChuQXR0cnMpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuQXR0cnM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhID0gbmV3IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBhdHRyTGlzdC5hZGQoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhdHRyTGlzdCk7Ci0KLSAgICAgICAgQXR0cmlidXRlW10gYXR0cnMgPSAoQXR0cmlidXRlW10pIGF0dHJMaXN0LnRvQXJyYXkoRU1QVFlfQVRUUlMpOyAKLSAgICAgICAgRWxlbWVudCBlID0gbmV3IEVsZW1lbnQocW5hbWUsIGF0dHJzKTsKLQotICAgICAgICBFbGVtZW50IHBhcmVudDsKLSAgICAgICAgaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcm9vdEVsZW1lbnQgPSBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFxbmFtZS5lcXVhbHMoImRlc2NyaXB0aW9uIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudCA9IChFbGVtZW50KSBlbGVtZW50cy5wZWVrKCk7Ci0gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudHMucHVzaChlKTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGN1cnJDb250ZW50IGlzIGFscmVhZHkgbm9uLXdoaXRlc3BhY2UuCi0gICAgICAgIC8vIGlmIGl0IGlzLCB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbiBhYm91dCAibWl4ZWQgY29udGVudCBub3Qgc3VwcG9ydGVkIgotICAgICAgICBjdXJyQ29udGVudC5zZXRMZW5ndGgoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgcyA9IGN1cnJDb250ZW50LnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICBpZiAoIXMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJyRWxlbWVudCgpLnNldENvbnRlbnQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyckNvbnRlbnQuc2V0TGVuZ3RoKDApOwotCi0gICAgICAgIGVsZW1lbnRzLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgewotICAgICAgICBjdXJyQ29udGVudC5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0Q3VyckVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSBlbGVtZW50cy5wZWVrKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTnVsbElucHV0U291cmNlLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9OdWxsSW5wdXRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyMTczOS4uMDAwMDAwMAotLS0gYS9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9OdWxsSW5wdXRTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubm9ybWFsaXplcjsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbElucHV0U291cmNlIGV4dGVuZHMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLXsKLSAgICBwdWJsaWMgTnVsbElucHV0U291cmNlKFN0cmluZyBwdWJJZCwgU3RyaW5nIHN5c0lkKQotICAgIHsKLSAgICAgICAgCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL1V0aWxzLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBjNzZlLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0KLS8qKgotICogUmVhZCBpbnB1dCBmaWxlIGFuZCB3cml0ZSBpdCBvdXQgd2l0aCBldmVyeXRoaW5nIG5vcm1hbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5kZW50KFByaW50V3JpdGVyIHdyaXRlciwgaW50IGFtb3VudCkKLSAgICB7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGFtb3VudDsgKytpKQotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgICIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL290aGVyL25vcm1hbGl6ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXJUZXN0LmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9Ob3JtYWxpemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JlZDUyLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBOb3JtYWxpemVyLgotICovCi1wdWJsaWMgY2xhc3MgTm9ybWFsaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIFJpZ29yb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZXIoKQotICAgIHsKLSAgICAgICAgLy8gVE9ETzogd3JpdGUgc29tZSByZWFsIHRlc3RzIGhlcmUKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL290aGVyL3NjcmlwdHMvUkVBRE1FLnR4dCBiL290aGVyL3NjcmlwdHMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmMmQwMy4uMDAwMDAwMAotLS0gYS9vdGhlci9zY3JpcHRzL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBob2xkcyB1c2VmdWwgZGV2ZWxvcG1lbnQgc2NyaXB0cy4KZGlmZiAtLWdpdCBhL290aGVyL3NjcmlwdHMvZGV0YWIuc2ggYi9vdGhlci9zY3JpcHRzL2RldGFiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzc4YTdjLi4wMDAwMDAwCi0tLSBhL290aGVyL3NjcmlwdHMvZGV0YWIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIFVuaXgvTGludXggc2hlbGwgc2NyaXB0IHRvIGNsZWFuIHVwIHdoaXRlc3BhY2UgaW4gYWxsIC5qYXZhIGZpbGVzIGluIGEgZGlyZWN0b3J5LgotIwotIyBBbGwgdGFicyBmb3VuZCBhcmUgcmVwbGFjZWQgd2l0aCA0IHNwYWNlcy4KLSMKLSMgQWRkIHRoZSBmb2xsb3dpbmcgdG8gYWxzbyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGFsbCBsaW5lczoKLSMgICAgLWUgInMvXHNccyokLy8iICBcCi1maW5kIC4gLW5hbWUgIi5zdm4iIC1wcnVuZSAtbyAtbmFtZSAiKi5qYXZhIiAtZXhlYyBcCi0gIHNlZCAtLWluLXBsYWNlIFwKLSAgICAtZSAicy9cdC8gICAgL2ciICBcCi0gIHt9IFw7Cg==